C++ C++;建立分段树时的分段错误

C++ C++;建立分段树时的分段错误,c++,arrays,segmentation-fault,structure,segment-tree,C++,Arrays,Segmentation Fault,Structure,Segment Tree,我正在尝试构建一个段树,以计算在给定数组间隔内具有最大和的子数组。。。(针对每个查询) 我在函数“void build()”中遇到分段错误,我已使用数组大小进行了检查…当大小较小时,此功能可以正常工作…但对于较大的数组大小,会出现分段错误 提前感谢:) #包括 #包括 #包括 使用名称空间std; typedef结构节点; 结构节点{ 长整数和; 长整型; 长内特贝斯特; 长整数最大值; }; 无效构建(节点*树,长整数n,长整数开始,长整数结束,长整数*ar){ 如果(开始==结束){ 树[

我正在尝试构建一个段树,以计算在给定数组间隔内具有最大和的子数组。。。(针对每个查询)

我在函数“void build()”中遇到分段错误,我已使用数组大小进行了检查…当大小较小时,此功能可以正常工作…但对于较大的数组大小,会出现分段错误

提前感谢:)


#包括
#包括
#包括
使用名称空间std;
typedef结构节点;
结构节点{
长整数和;
长整型;
长内特贝斯特;
长整数最大值;
};
无效构建(节点*树,长整数n,长整数开始,长整数结束,长整数*ar){
如果(开始==结束){
树[n].sum=tree[n].lbest=tree[n].rbest=tree[n].max=ar[start];
返回;
}
否则{
长整数中间=(开始+结束)/2;
构建(树,(2*n)+1,开始,中间,ar);
构建(树,(2*n)+2,中间+1,末端,ar);
树[n]。总和=树[2*n+1]。总和+树[2*n+2]。总和;
树[n].lbest=max(树[2*n+1].lbest,树[2*n+1].sum+tree[2*n+2].lbest);
树[n].rbest=max(树[2*n+2].rbest,树[2*n+2].sum+tree[2*n+1].rbest);
树[n].max=max(树[n].sum,max(树[n].lbest,树[n].rbest));

//cout段树的最小大小必须为2^(cel(log(n))+1)-1,其中n是数组中的元素数


只需将段树大小增加到3*n即可


源:

与你的问题无关,但C++没有真正的使用。使用<代码>:ST::向量。谢谢。……使用向量和检查……但是我只是在程序中做了一些修改,并把它作为“C”程序运行,但它仍然会造成分割错误……(……有任何建议……

success test case:
3 
-1 2 3
1
1 2
2

seg fault test case:
90
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
9
1 4
3 5
5 9
1 40
2 50
5 90
10 40
50 90
30 50
<pre><code>
#include<iostream>
#include<limits.h>
#include<math.h>
using namespace std;

typedef struct node node;
struct node{
    long int sum;
    long int lbest;
    long int rbest;
    long int max;
};


void build(node *tree , long int n , long int start , long int end , long int *ar ){
    if(start == end){
        tree[n].sum = tree[n].lbest = tree[n].rbest = tree[n].max = ar[start];
        return ;
    }
    else{
    long int mid = (start + end)/2;
    build(tree , (2*n) +1 , start , mid , ar);
    build(tree , (2*n) +2 , mid+1 , end , ar);

    tree[n].sum = tree[2*n+1].sum + tree[2*n+2].sum;
    tree[n].lbest = max(tree[2*n+1].lbest , tree[2*n+1].sum + tree[2*n+2].lbest);
    tree[n].rbest = max(tree[2*n+2].rbest , tree[2*n+2].sum + tree[2*n+1].rbest);
    tree[n].max = max(tree[n].sum , max(tree[n].lbest , tree[n].rbest));
 //     cout<<start<<" "<<end<<" -- "<<n<<" ";
 //     cout<<" else "<<endl;

    }

}

long int query(node *tree , long int  n , long int l , long int r , long int start , long int end){
    if(l > end || r < start)return INT_MIN;
    if(start >= l && end <= r)return tree[n].max;
    long int mid = (start + end)/2;
    return max(query(tree, (n*2)+1 , l , r , start , mid) , query(tree , 2*n+2 , l , r, mid +1 , end));
}




int main(){
    // ios_base::sync_with_stdio(false);
    // cin.tie(NULL);
    // cout.tie(NULL);


    long int n , q;
    scanf("%ld" , &n);

    long int ar[n];
    for(long int i = 0 ;i< n ; i++)cin>>ar[i];

    long int nn = n*2;
    node tree[nn+1];
    build(tree, 0 ,0,n-1 ,ar);

    scanf("%ld" , &q);

    while(q--){
        long a , b ;
        scanf("%ld %ld" , &a ,&b);
            a-- ;b--;
        printf("%ld\n" ,query(tree, 0 , a , b, 0 , n-1));
    }



    return 0;
}




</code></pre>