P4344 [SHOI2015] 脑洞治疗仪
P2572 [SCOI2010] 序列操作
这两题想了好久,感觉问题出在连续子段那里,然后维护不会
然后自己又写了一下模板题
#include<bits/stdc++.h>
#define ls id<<1
#define rs id<<1|1
using namespace std;
const int N=5e5+10;
int n,q,a[N];
struct tree{
int l,r;
int sum,lmx,rmx,mx;
}tr[N<<2];
void pushup(tree &id,tree l,tree r){
id.sum=l.sum+r.sum;
id.lmx=max(l.lmx,l.sum+r.lmx);
id.rmx=max(r.rmx,r.sum+l.rmx);
id.mx=max(max(l.mx,r.mx),l.rmx+r.lmx);
}
void build(int id,int l,int r){
tr[id]={l,r,a[l],a[l],a[l],a[l]};
if(l==r)return ;
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(tr[id],tr[ls],tr[rs]);
}
void mod(int id,int x,int v){
if(tr[id].l==tr[id].r){
tr[id]={x,x,v,v,v,v};
return ;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(x<=mid)mod(ls,x,v);
else mod(rs,x,v);
pushup(tr[id],tr[ls],tr[rs]);
}
tree query(int id,int l,int r){
if(l<=tr[id].l&&tr[id].r<=r)return tr[id];
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid)return query(ls,l,r);
if(l>mid)return query(rs,l,r);
tree t;
pushup(t,query(ls,l,mid),query(rs,mid+1,r));
return t;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
if(x>y)swap(x,y);
cout<<query(1,x,y).mx<<endl;
}
else mod(1,x,y);
}
return 0;
}