C++ 在段树中查找最大值的问题中出错

C++ 在段树中查找最大值的问题中出错,c++,recursion,stack-overflow,segment-tree,C++,Recursion,Stack Overflow,Segment Tree,编译程序时会抛出以下错误: 0x000418B9ölaba6c++.exe处未处理的异常:0xC00000FD:堆栈溢出(特征:0x00000001,0x00402FFC) 我认为这个错误是由于maxim函数的递归太多造成的,但我不知道如何修复它 #include <iostream> #include <cstdio> #include <vector> const int INF = 1000; using namespace std; int co

编译程序时会抛出以下错误:

0x000418B9ölaba6c++.exe处未处理的异常:0xC00000FD:堆栈溢出(特征:0x00000001,0x00402FFC)

我认为这个错误是由于
maxim
函数的递归太多造成的,但我不知道如何修复它

#include <iostream>
#include <cstdio>
#include <vector>

const int INF = 1000;

using namespace std;

int const n = 5;
int t[4 * n];
int a[] = { 2, 2, 2, 1, 5 };

int find_max(int a, int b) {
    if (a > b) return a;
    if (b > a) return b;
    return a;
}

int find_min(int a, int b) {
    if (a < b) return a;
    if (b < a) return b;
    return a;
}


void build(int a[], int v, int tl, int tr) {    //а-массив с числами, v-текущая вершина, tl & tr - границы соответствующие текущей вершине
    if (tl == tr)
        t[v] = a[tl];       //определяем номер для листа дерева
    else {
        int tm = (tl + tr) / 2;         // tm-середина
        build(a, v * 2, tl, tm);        //строим левую часть дерева
        build(a, v * 2 + 1, tm + 1, tr);        //строим правую часть дерева
        t[v] = find_max(t[v * 2], t[v * 2 + 1]);            //определяем номер текущей вершины
    }
}

int maxim(int v, int tl, int tr, int l, int r) {
    if (l > r)
        return -INF;
    if (l == tl && r == tr)
        return t[v];
    int tm = (tl + tr) / 2;
    return find_max(maxim(v * 2, tl, tm, l, find_min(r, tm)), maxim(v * 2 + 1, tm + 1, tr, find_max(l, tm + 1), r));
}

int main() {
    build(a, 1, 0, n - 1);
    cout << maxim(1, 0, n - 1, 2, 5);
}
#包括
#包括
#包括
常数int INF=1000;
使用名称空间std;
int常数n=5;
int t[4*n];
inta[]={2,2,2,1,5};
int find_max(int a,int b){
如果(a>b)返回a;
如果(b>a)返回b;
返回a;
}
int find_min(int a,int b){
如果(ar)
return-INF;
如果(l==tl&&r==tr)
返回t[v];
int tm=(tl+tr)/2;
返回find_max(最大值(v*2,tl,tm,l,find_min(r,tm)),最大值(v*2+1,tm+1,tr,find_max(l,tm+1),r));
}
int main(){
构建(a,1,0,n-1);

您的代码试图做什么?很明显,您有一个导致堆栈溢出的无结束递归,但是我们无法修复它,除非您提供有关所实现方法的其他信息。@pr0f3ss“maxim”函数是一个递归函数,我们将有关树的当前顶点的信息传递给它。v是当前顶点的数目,tl和tr是与当前树顶点对应的段的边界,l和r是当前查询的边界。函数必须在指定的间隔上找到最大值(左…右)