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
我真的不该学习线段树