标签:
线段树维护两个值四个标记,注意打标记的顺序。
#include<bits/stdc++.h> #define N (1<<18) #define M (l+r>>1) #define P (k<<1) #define S (k<<1|1) #define L l,M,P #define R M+1,r,S #define Z int l=1,int r=n,int k=1 using namespace std; int n; typedef int ds[N]; ds a,b,c,d,u,v; int read(){ int x; scanf("%d",&x); return x; } void update(int k){ u[k]=max(u[P],u[S]); v[k]=max(v[P],v[S]); } void build(Z){ if(l==r) u[k]=v[k]=read(); else{ build(L); build(R); update(k); } a[k]=c[k]=INT_MIN; } void A(int x,int k){ u[k]=a[k]=x; b[k]=0; c[k]=max(c[k],a[k]); v[k]=max(v[k],u[k]); } void B(int x,int k){ if(a[k]!=INT_MIN) A(a[k]+x,k); else{ u[k]+=x; b[k]+=x; d[k]=max(d[k],b[k]); v[k]=max(v[k],u[k]); } } void C(int x,int k){ c[k]=max(c[k],x); v[k]=max(v[k],c[k]); } void D(int x,int k){ if(a[k]!=INT_MIN) C(a[k]+x,k); else{ d[k]=max(d[k],b[k]+x); v[k]=max(v[k],u[k]+x); } } void devolve(int k){ if(c[k]!=INT_MIN){ C(c[k],P); C(c[k],S); c[k]=INT_MIN; } if(d[k]){ D(d[k],P); D(d[k],S); d[k]=0; } if(a[k]!=INT_MIN){ A(a[k],P); A(a[k],S); a[k]=INT_MIN; } if(b[k]){ B(b[k],P); B(b[k],S); b[k]=0; } } void F(int x,int s,int t,Z){ if(s==l&&t==r) A(x,k); else{ devolve(k); if(t<=M) F(x,s,t,L); else if(s>M) F(x,s,t,R); else{ F(x,s,M,L); F(x,M+1,t,R); } update(k); } } void G(int x,int s,int t,Z){ if(s==l&&t==r) B(x,k); else{ devolve(k); if(t<=M) G(x,s,t,L); else if(s>M) G(x,s,t,R); else{ G(x,s,M,L); G(x,M+1,t,R); } update(k); } } int H(int s,int t,Z){ if(s==l&&t==r) return u[k]; devolve(k); return t<=M?H(s,t,L) :s>M?H(s,t,R) :max(H(s,M,L),H(M+1,t,R)); } int I(int s,int t,Z){ if(s==l&&t==r) return v[k]; devolve(k); return t<=M?I(s,t,L) :s>M?I(s,t,R) :max(I(s,M,L),I(M+1,t,R)); } int main(){ char c[2]; int m,s,t; n=read(); build(); m=read(); while(m--){ scanf("%s%d%d",c,&s,&t); if(*c==‘C‘) F(read(),s,t); if(*c==‘P‘) G(read(),s,t); if(*c==‘Q‘) printf("%d\n",H(s,t)); if(*c==‘A‘) printf("%d\n",I(s,t)); } }
标签:
原文地址:http://www.cnblogs.com/f321dd/p/5496047.html