第五个点WA了。
#include<iostream>
#include<queue>
#define mn 100010
#define inf 0x3f3f3f3f
#define ls x<<1
#define rs x<<1|1
using namespace std;
struct id{int v,l,r;};
struct node
{
int l,r;
int sum;
id lmx,rmx,mmx;
id lmn,rmn,mmn;
int tag;
}tr[mn<<2];
id zo={0,0,0};
node null={0,0,0,zo,zo,zo,zo,zo,zo};
int n,m;
int ans;
queue<id>q;
inline node merge(node A,node B)
{
node res;
res.l=A.l,res.r=B.r;
res.sum=A.sum+B.sum;
res.lmx=A.lmx.v>=(A.sum+B.lmx.v)?A.lmx:(id){A.sum+B.lmx.v,A.l,B.lmx.r};
res.rmx=B.rmx.v>=(B.sum+A.rmx.v)?B.rmx:(id){B.sum+A.rmx.v,A.rmx.l,B.r};
res.mmx=A.mmx.v>=B.mmx.v?A.mmx:B.mmx;
res.mmx=res.mmx.v>=(A.rmx.v+B.lmx.v)?res.mmx:(id){A.rmx.v+B.lmx.v,A.rmx.l,B.lmx.r};
res.lmn=A.lmn.v<=(A.sum+B.lmn.v)?A.lmx:(id){A.sum+B.lmn.v,A.l,B.lmn.r};
res.rmn=B.rmn.v<=(B.sum+A.rmn.v)?A.rmn:(id){B.sum+A.rmn.v,A.rmn.l,B.r};
res.mmn=A.mmn.v<=B.mmn.v?A.mmn:B.mmn;
res.mmn=res.mmn.v<=(A.rmn.v+B.lmn.v)?res.mmn:(id){A.rmn.v+B.lmn.v,A.rmn.l,B.lmn.r};
res.tag=0;
return res;
}
inline void rev(int x)
{
tr[x].tag^=1,tr[x].sum*=-1;
swap(tr[x].lmx,tr[x].lmn);
swap(tr[x].rmx,tr[x].rmn);
swap(tr[x].mmx,tr[x].mmn);
tr[x].lmx.v*=-1,tr[x].rmx.v*=-1,tr[x].mmx.v*=-1;
tr[x].lmn.v*=-1,tr[x].rmn.v*=-1,tr[x].mmn.v*=-1;
}
inline void pushdown(int x)
{
if(!tr[x].tag)return;
rev(ls),rev(rs);
tr[x].tag^=1;
}
inline void build(int x,int l,int r)
{
tr[x].l=l,tr[x].r=r;
tr[x].tag=0;
if(l==r)
{
cin>>tr[x].sum;
tr[x].lmx=tr[x].rmx=tr[x].mmx={tr[x].sum,l,r};
tr[x].lmn=tr[x].rmn=tr[x].mmn={tr[x].sum,l,r};
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
tr[x]=merge(tr[ls],tr[rs]);
}
inline void update(int x,int l,int r,int k)
{
if(l>tr[x].r||r<tr[x].l)return;
if(l<=tr[x].l&&tr[x].r<=r)
{
tr[x].sum=k;
tr[x].lmx=tr[x].rmx=tr[x].mmx={k,l,r};
tr[x].lmn=tr[x].rmn=tr[x].mmn={k,l,r};
return;
}
pushdown(x);
update(ls,l,r,k);
update(rs,l,r,k);
tr[x]=merge(tr[ls],tr[rs]);
}
inline void revers(int x,int l,int r)
{
if(l>tr[x].r||r<tr[x].l)return;
if(l<=tr[x].l&&tr[x].r<=r)
{
rev(x);
return;
}
pushdown(x);
revers(ls,l,r);
revers(rs,l,r);
tr[x]=merge(tr[ls],tr[rs]);
}
inline node query(int x,int l,int r)
{
if(l>tr[x].r||r<tr[x].l)return null;
if(l<=tr[x].l&&tr[x].r<=r)return tr[x];
pushdown(x);
return merge(query(ls,l,r),query(rs,l,r));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("input.txt","r",stdin);
cin>>n;
build(1,1,n);
cin>>m;
int opt,l,r,k;
for(int t=1;t<=m;++t)
{
cin>>opt;
ans=0;
switch(opt)
{
case 0:
{
cin>>l>>k;
update(1,l,l,k);
break;
}
default:
{
cin>>l>>r>>k;
for(int i=1;i<=k;++i)
{
node tmp=query(1,l,r);
if(tmp.mmx.v<0)break;
ans+=tmp.mmx.v;
revers(1,tmp.mmx.l,tmp.mmx.r);
q.push(tmp.mmx);
}
cout<<ans<<'\n';
while(!q.empty())
{
id tmp=q.front();
q.pop();
revers(1,tmp.l,tmp.r);
}
break;
}
}
}
return 0;
}