查找段树实现中的错误



我试图解决这个问题 - 链接。具有延迟传播的分段树。但我不知道我在哪里犯了错误。请帮我找到错误。
我是具有延迟传播的分段树的新手。但我的代码似乎还可以。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000; 
struct info{ long long sum, prop; }; info tree[300010];
void update(int node, int l, int r, int i, int j,  int val) {
    if( i > r || j < l) return; 
    if(i <= l && j >= r) {
        tree[node].sum += (r-l+1)*val; 
        tree[node].prop += val;
        return;
    } int left = node*2, right = left|1, mid = (l+r)/2;
    update(left, l, mid, i,j,val); 
    update(right, mid+1, r, i,j,val);
    tree[node].sum = tree[left].sum + tree[right].sum + (r-l+1)*tree[node].prop;
}
long long query(int node, int l, int r, int i, int j, long long carry = 0) {
    if(i > r || j < l ) return 0;
    if(i <= l && j >= r) return tree[node].sum + (r-l+1)*carry;
    int mid = (l+r)/2, left = node*2, right = left|1; 
    long long ret = query(left, l, mid, i,j, carry + tree[node].prop); 
    ret += query(right,mid+1,r,i,j, carry + tree[node].prop);
    return ret;
}
int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
    freopen("in", "r", stdin);
#endif
    int t,co=0; scanf("%d", &t); while(t--) {
        int n, q; scanf("%d %d", &n, &q);
        for(int i=0; i<=3*n; i++) tree[i].sum = tree[i].prop = 0;
        printf("Case %d:n", ++co);
        while(q--) { 
            int type,a,b,c; scanf("%d", &type); if(!type) {
                scanf("%d %d %d", &a, &b, &c); 
                update(1, 0, n-1, a,b,c);
            } else {
                scanf("%d %d", &a, &b); 
                printf("%dn", query(1, 0, n-1, a,b));
            }
        }
    }
}

首先,这个网站不是用来查找代码中的错误。为此,请尝试 https://codereview.stackexchange.com/。

无论如何,在您的代码中,函数的返回类型很长query()main您正在打印整数类型。 将printf("%dn", query(1, 0, n-1, a,b));更改为printf("%lldn", query(1, 0, n-1, a,b));,我希望你能得到AC。

最新更新