WA1,2,9,10
但是真的是模板啊。
#include<bits/stdc++.h>
#define int long long
#define N 100009
using namespace std;
int n,m,a[N];
struct Node{
int l,r,maxx1,maxx2,add1,add2,tobe1,tobe2;
}tr[N*4];
void pushup(int u){
tr[u].maxx1=max(tr[u<<1].maxx1,tr[u<<1|1].maxx1);
tr[u].maxx2=max(tr[u<<1].maxx2,tr[u<<1|1].maxx2);
}
void eval(Node &t,int add1,int add2,int tobe1,int tobe2){
t.maxx2=max(t.maxx2,tobe2);
t.tobe2=max(t.tobe2,tobe2);
t.maxx2=max(t.maxx2,t.maxx1+add2);
t.add2=max(t.add2,t.add1+add2);
if(tobe1!=-1e18){
t.maxx1=tobe1;
t.add1=0;
t.tobe1=tobe1;
}
t.maxx1+=add1;
t.add1+=add1;
}
void pushdown(int u){
eval(tr[u<<1],tr[u].add1,tr[u].add2,tr[u].tobe1,tr[u].tobe2);
eval(tr[u<<1|1],tr[u].add1,tr[u].add2,tr[u].tobe1,tr[u].tobe2);
tr[u].add1=tr[u].add2=0,tr[u].tobe1=tr[u].tobe2=-1e18;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r,tr[u].maxx1=tr[u].maxx2=-1e18,tr[u].add1=tr[u].add2=0,tr[u].tobe1=tr[u].tobe2=-1e18;
if(l==r){
tr[u].maxx1=tr[u].maxx2=a[l];
return ;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify_add(int u,int l,int r,int x){
if(tr[u].l>=l&&tr[u].r<=r){
eval(tr[u],x,x,-1e18,-1e18);
return ;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid){
modify_add(u<<1,l,r,x);
}
if(r>mid){
modify_add(u<<1|1,l,r,x);
}
pushup(u);
}
void modify_tobe(int u,int l,int r,int x){
if(tr[u].l>=l&&tr[u].r<=r){
eval(tr[u],0,0,x,x);
return ;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid){
modify_tobe(u<<1,l,r,x);
}
if(r>mid){
modify_tobe(u<<1|1,l,r,x);
}
pushup(u);
}
int query_max1(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].maxx1;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1,ans=-1e18;
if(l<=mid){
ans=max(ans,query_max1(u<<1,l,r));
}
if(r>mid){
ans=max(ans,query_max1(u<<1|1,l,r));
}
return ans;
}
int query_max2(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].maxx2;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1,ans=-1e18;
if(l<=mid){
ans=max(ans,query_max2(u<<1,l,r));
}
if(r>mid){
ans=max(ans,query_max2(u<<1|1,l,r));
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
cin>>m;
for(int i=1;i<=m;i++){
char op;
int x,y,z;
cin>>op;
if(op=='Q'){
cin>>x>>y;
cout<<query_max1(1,x,y)<<endl;
}
else if(op=='A'){
cin>>x>>y;
cout<<query_max2(1,x,y)<<endl;
}
else if(op=='P'){
cin>>x>>y>>z;
modify_add(1,x,y,z);
}
else{
cin>>x>>y>>z;
modify_tobe(1,x,y,z);
}
}
return 0;
}