注意这题要维护历史最大加和历史最大覆盖
1 /************************************************************** 2 Problem: 3064 3 User: white_hat_hacker 4 Language: C++ 5 Result: Accepted 6 Time:3868 ms 7 Memory:15288 kb 8 ****************************************************************/ 9 10 #include<cstdio> 11 #include<cstdlib> 12 #include<algorithm> 13 #include<cstring> 14 #define INF 0x7f7f7f7f 15 #define MAXN 100010 16 #define rint register int 17 using namespace std; 18 int read(){ 19 int x=0,f=1;char ch=getchar(); 20 while(ch<‘0‘||ch>‘9‘){if(‘-‘==ch)f=-1;ch=getchar();} 21 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 22 return x*f; 23 } 24 #define lc k<<1 25 #define rc k<<1|1 26 struct SegmentTree{ 27 struct Node{ 28 int L,R; 29 int vl,_vl; 30 int add,_add; 31 int cov,_cov; 32 bool iscov; 33 }st[MAXN<<2]; 34 int s[MAXN]; 35 void pushup(int k){ 36 st[k].vl=max(st[lc].vl,st[rc].vl); 37 st[k]._vl=max(st[lc]._vl,st[rc]._vl); 38 } 39 void workcov(int k,int cov,int _cov){ 40 st[k].iscov=true; 41 st[k]._vl=max(st[k]._vl,_cov); 42 st[k]._cov=max(st[k]._cov,_cov); 43 st[k].vl=cov; 44 st[k].cov=cov; 45 st[k].add=0; 46 } 47 void workadd(int k,int add,int _add){ 48 if(st[k].iscov){ 49 workcov(k,st[k].cov+add,st[k].cov+_add); 50 } 51 else{ 52 st[k]._vl=max(st[k]._vl,st[k].vl+_add); 53 st[k]._add=max(st[k]._add,st[k].add+_add); 54 st[k].vl+=add; 55 st[k].add+=add; 56 } 57 } 58 void pushdown(int k){ 59 int c=k<<1; 60 for(rint i=0;i<=1;i++){ 61 c|=i; 62 workadd(c,st[k].add,st[k]._add); 63 if(st[k].iscov) 64 workcov(c,st[k].cov,st[k]._cov); 65 } 66 st[k].iscov=false; 67 st[k].add=st[k]._add=0; 68 st[k].cov=st[k]._cov=-INF; 69 } 70 void build(int k,int L,int R){ 71 st[k].L=L,st[k].R=R; 72 st[k].cov=st[k]._cov=-INF; 73 if(L==R){ 74 st[k].vl=st[k]._vl=s[L]; 75 } 76 else{ 77 int mid=(L+R)>>1; 78 build(lc,L,mid); 79 build(rc,mid+1,R); 80 pushup(k); 81 } 82 } 83 void add(int k,int a,int b,int v){ 84 int L=st[k].L,R=st[k].R; 85 int mid=(L+R)>>1; 86 if(a<=L&&R<=b){ 87 workadd(k,v,v); 88 } 89 else{ 90 pushdown(k); 91 if(a<=mid)add(lc,a,b,v); 92 if(b>mid)add(rc,a,b,v); 93 pushup(k); 94 } 95 } 96 void cov(int k,int a,int b,int v){ 97 int L=st[k].L,R=st[k].R; 98 int mid=(L+R)>>1; 99 if(a<=L&&R<=b){ 100 workcov(k,v,v); 101 } 102 else{ 103 pushdown(k); 104 if(a<=mid)cov(lc,a,b,v); 105 if(b>mid)cov(rc,a,b,v); 106 pushup(k); 107 } 108 } 109 int query(int k,int a,int b){ 110 int L=st[k].L,R=st[k].R; 111 int mid=(L+R)>>1; 112 if(a<=L&&R<=b){ 113 return st[k].vl; 114 } 115 else{ 116 pushdown(k); 117 int ans=-INF; 118 if(a<=mid)ans=max(ans,query(lc,a,b)); 119 if(b>mid)ans=max(ans,query(rc,a,b)); 120 return ans; 121 } 122 } 123 int _query(int k,int a,int b){ 124 int L=st[k].L,R=st[k].R; 125 int mid=(L+R)>>1; 126 if(a<=L&&R<=b){ 127 return st[k]._vl; 128 } 129 else{ 130 pushdown(k); 131 int ans=-INF; 132 if(a<=mid)ans=max(ans,_query(lc,a,b)); 133 if(b>mid)ans=max(ans,_query(rc,a,b)); 134 return ans; 135 } 136 } 137 }ST; 138 #undef lc 139 #undef rc 140 int n; 141 int main() 142 { 143 n=read(); 144 for(rint i=1;i<=n;i++){ 145 ST.s[i]=read(); 146 } 147 ST.build(1,1,n); 148 int T=read(); 149 char s[5]; 150 int x,y,z; 151 while(T--){ 152 scanf("%s%d%d",s,&x,&y); 153 if(‘Q‘==s[0])printf("%d\n",ST.query(1,x,y)); 154 else if(‘A‘==s[0])printf("%d\n",ST._query(1,x,y)); 155 else{ 156 scanf("%d",&z); 157 if(‘P‘==s[0])ST.add(1,x,y,z); 158 else ST.cov(1,x,y,z); 159 } 160 } 161 return 0; 162 }