rt
在我改出来之前找出问题的dalao加关注
#include<bits/stdc++.h>
using namespace std;
#define ls (u*2)
#define rs (u*2+1)
inline int rd(){
int f=1,j=0;
char w=getchar();
while(!isdigit(w)){
if(w=='-')f=-1;
w=getchar();
}
while(isdigit(w)){
j=j*10+w-'0';
w=getchar();
}
return f*j;
}
const int N=100010;
int ma[N*4],ans[N*4];
int ad[N*4],cov[N*4],vis[N*4];
int adma[N*4],covma[N*4];
int n,m,sum[N];
inline void update(int u){
ma[u]=max(ma[ls],ma[rs]);
ans[u]=max(ans[u],max(ans[ls],ans[rs]));
return ;
}
inline void pushdown(int u){
ans[ls]=max(ans[ls],covma[u]);
ans[rs]=max(ans[rs],covma[u]);
covma[ls]=max(covma[u],covma[ls]);
covma[rs]=max(covma[u],covma[rs]);
covma[u]=INT_MIN;
if(vis[u]){
ad[ls]=ad[rs]=0,cov[ls]=cov[rs]=cov[u];
ma[ls]=ma[rs]=cov[u];
vis[ls]=vis[rs]=true,vis[u]=false;
}
ans[ls]=max(ans[ls],ma[ls]+adma[u]);
ans[rs]=max(ans[rs],ma[rs]+adma[u]);
adma[ls]+=adma[u],adma[rs]+=adma[u];
adma[u]=0;
ma[ls]+=ad[u],ma[rs]+=ad[u];
ad[ls]+=ad[u],ad[rs]+=ad[u];
ad[u]=0;
return ;
}
void built(int u,int l,int r){
covma[u]=ans[u]=INT_MIN;
if(l==r)return ma[u]=ans[u]=sum[l],void();
int mid=(l+r)/2;
built(ls,l,mid),built(rs,mid+1,r);
update(u);
return ;
}
void modifyp(int u,int l,int r,int L,int R,int sumn){
if(L<=l&&r<=R){
ma[u]+=sumn,ad[u]+=sumn;
adma[u]=max(adma[u],ad[u]);
ans[u]=max(ans[u],ma[u]);
return ;
}
pushdown(u);
int mid=(l+r)/2;
if(L<=mid)modifyp(ls,l,mid,L,R,sumn);
if(R>mid)modifyp(rs,mid+1,r,L,R,sumn);
update(u);
return ;
}
void modifyc(int u,int l,int r,int L,int R,int sumn){
if(L<=l&&r<=R){
if(l!=r)pushdown(u);
vis[u]=true,cov[u]=sumn;
ma[u]=sumn;
covma[u]=max(covma[u],cov[u]);
ans[u]=max(ans[u],ma[u]);
if(l!=r)pushdown(u);
return ;
}
pushdown(u);
int mid=(l+r)/2;
if(L<=mid)modifyc(ls,l,mid,L,R,sumn);
if(R>mid)modifyc(rs,mid+1,r,L,R,sumn);
update(u);
return ;
}
int queryq(int u,int l,int r,int L,int R){
if(L<=l&&r<=R)return ma[u];
pushdown(u);
int mid=(l+r)/2,ansn=INT_MIN;
if(L<=mid)ansn=max(ansn,queryq(ls,l,mid,L,R));
if(R>mid)ansn=max(ansn,queryq(rs,mid+1,r,L,R));
return ansn;
}
int querya(int u,int l,int r,int L,int R){
if(L<=l&&r<=R)return ans[u];
pushdown(u);
int mid=(l+r)/2,ansn=INT_MIN;
if(L<=mid)ansn=max(ansn,querya(ls,l,mid,L,R));
if(R>mid)ansn=max(ansn,querya(rs,mid+1,r,L,R));
return ansn;
}
void bug(int u,int l,int r){
cout<<u<<":"<<l<<" "<<r<<":"<<ma[u]<<" "<<ans[u]<<"\n";
if(l==r)return ;
int mid=(l+r)/2;
bug(ls,l,mid),bug(rs,mid+1,r);
return ;
}
char s[10];
signed main(){
n=rd();
for(int i=1;i<=n;i++)sum[i]=rd();
built(1,1,n);
m=rd();
for(int i=1;i<=m;i++){
scanf("%s",s+1);
if(s[1]=='Q'){
int l=rd(),r=rd();
printf("%d\n",queryq(1,1,n,l,r));
}
else if(s[1]=='A'){
int l=rd(),r=rd();
printf("%d\n",querya(1,1,n,l,r));
}
else if(s[1]=='P'){
int l=rd(),r=rd(),z=rd();
modifyp(1,1,n,l,r,z);
}
else{
int l=rd(),r=rd(),z=rd();
modifyc(1,1,n,l,r,z);
}
// bug(1,1,n);
}
return 0;
}
/*
10
-12 -10 -10 -7 -11 -8 -12 -7 -10 -4
5
Q 5 9
Q 1 1
C 1 9 -1
A 6 7
C 6 7 6
*/