为什么样例全输出0啊!大佬救命

P4513 小白逛公园

FF_pigeon @ 2023-08-09 17:20:23

我手推了一遍,感觉没问题 再在这里先谢谢每一个帮忙的大佬...

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 100;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n, m, o, a, b, cnt=1;
struct xds{
    int l,r;
    int ls,rs;
    int maxx,maxl,maxr,sum;
}t[N*4];
void pushup( int rt ){
    t[rt].sum = t[t[rt].ls].sum + t[t[rt].rs].sum;
    t[rt].maxl = max(t[t[rt].ls].maxl,t[t[rt].ls].sum+t[t[rt].rs].maxl);
    t[rt].maxr = max(t[t[rt].rs].maxr,t[t[rt].rs].sum+t[t[rt].ls].maxr);
    t[rt].maxx = max(max(t[t[rt].ls].maxx,t[t[rt].rs].maxx),t[t[rt].ls].maxr+t[t[rt].rs].maxl);
}
void build( int x , int l , int r ){
    if( l == r ){
        cin >> t[x].maxx;
        t[x].l = l;
        t[x].r = r;
        t[x].maxl = t[x].maxr = t[x].sum = t[x].maxx;
        return ;
    }
    int mid = (l+r)/2;
    t[x].l = l;
    t[x].r = r;
    int tmp = x;
    cnt++;
    t[x].ls = cnt;
    build(t[x].ls,l,mid);
    cnt++;
    t[x].rs = cnt;
    build(t[x].rs,mid+1,r);
    pushup( tmp );
}
void update( int x , int d , int k ){
    if( t[x].l == t[x].r ){
        t[x].maxl = t[x].maxr = t[x].maxx = t[x].sum = k;
        return;
    }
    if( d <= t[t[x].ls].r)update(t[x].ls,d,k);
    else update(t[x].rs,d,k);
    pushup(x);
}
xds query( int x , int ll , int rr ){
    if( ll <= t[x].l && rr >= t[x].r ){
        return t[x];
    }
    int mid = (t[x].l+t[x].r) / 2;
    if( ll > mid )query(t[x].rs,ll,rr);
    else{
        if( rr <= mid )query(t[x].ls,ll,rr);
        else{
            xds g, s1, s2;
            s1 = query(t[x].ls,ll,rr);
            s2 = query(t[x].rs,ll,rr);
            g.maxl = max(s1.maxl,s1.sum+s2.maxl);
            g.maxr = max(s2.maxr,s1.maxr+s2.sum);
            g.maxx = max(max(s1.maxx,s2.maxx),(s1.maxr+s2.maxl));
            return g;
        }
    }
}
int main()
{
    freopen("xiaobai.in","r",stdin);
    cin >> n >> m;
    build(cnt,1,n);
//      for( int i = 1 ; i <= n*2-1 ; ++i ){
//      cout << t[i].maxx << " " << t[i].maxl << " " << t[i].maxr << " " << t[i].sum << endl;
//  }
    while( m-- ){
        cin >> o >> a >> b;
        if( o == 1 ){
            if( a > b )swap(a,b);
            cout << query(1,a,b).maxx << endl;
        }   
        if( o == 2 ){
            update(1,a,b);
//              for( int i = 1 ; i <= n*2-1 ; ++i ){
//              cout << t[i].maxx << " " << t[i].maxl << " " << t[i].maxr << " " << t[i].sum << endl;
//          }
        }
    }
//      for( int i = 1 ; i <= n*2-1 ; ++i ){
//      cout << t[i].maxx << " " << t[i].maxl << " " << t[i].maxr << " " << t[i].sum << endl;
//  }
    return 0;
}

by FF_pigeon @ 2023-08-09 17:20:53

我真的不该学习线段树


|