#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define LL long long #define INF (LL)1<<60 #define N 1200000 LL n,m,op,x,y,z,cov[N*2][2],cov2[N*2][2],a[N]; inline void pushdown(LL x){ for (LL i=0,y=x<<1|i;i<2;i++,y=x<<1|i){ cov2[y][0]=max(cov2[y][0],cov[y][0]+cov2[x][0]); cov2[y][1]=max(cov2[y][1],max(cov[y][1]+cov2[x][0],cov2[x][1])); cov[y][0]=max(cov[y][0]+cov[x][0],-INF); cov[y][1]=max(cov[y][1]+cov[x][0],cov[x][1]); } cov[x][0]=cov[x][1]=cov2[x][0]=cov2[x][1]=0; } void change(LL x,LL l,LL r,LL L,LL R,LL p,LL q){ if (L<=l && R>=r){ cov[x][0]=max(cov[x][0]+p,-INF); cov[x][1]=max(cov[x][1]+p,q); cov2[x][0]=max(cov2[x][0],cov[x][0]); cov2[x][1]=max(cov2[x][1],cov[x][1]); return; } pushdown(x); LL mid=(l+r)>>1; if (L<=mid) change(x<<1,l,mid,L,R,p,q); if (R>mid) change(x<<1|1,mid+1,r,L,R,p,q); } LL query(LL x,LL l,LL r,LL k){ if (l==r) return max(cov[x][0]+a[k],cov[x][1]); pushdown(x); LL mid=(l+r)>>1; if (k<=mid) return query(x<<1,l,mid,k); if (k>mid) return query(x<<1|1,mid+1,r,k); return 0; } LL ask(LL x,LL l,LL r,LL k){ if (l==r) return max(cov2[x][0]+a[k],cov2[x][1]); pushdown(x); LL mid=(l+r)>>1; if (k<=mid) return ask(x<<1,l,mid,k); if (k>mid) return ask(x<<1|1,mid+1,r,k); return 0; } int main(){ scanf("%lld%lld",&n,&m); for (LL i=1;i<=n;i++) scanf("%lld",&a[i]); for (LL i=1;i<=m;i++){ scanf("%lld",&op); if (op==1){ scanf("%lld%lld%lld",&x,&y,&z); change(1,1,n,x,y,z,-INF); } if (op==2){ scanf("%lld%lld%lld",&x,&y,&z); change(1,1,n,x,y,-z,0); } if (op==3){ scanf("%lld%lld%lld",&x,&y,&z); change(1,1,n,x,y,-INF,z); } if (op==4){ scanf("%lld",&x); printf("%lld\n",query(1,1,n,x)); } if (op==5){ scanf("%lld",&x); printf("%lld\n",ask(1,1,n,x)); } } return 0; }
|