1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=500001; int n,m; struct segment_tree{ int l,r; int sum,lsum,rsum,dat; }; segment_tree tree[maxn*4];
#define l(x) tree[x].l #define r(x) tree[x].r #define sum(x) tree[x].sum #define lsum(x) tree[x].lsum #define rsum(x) tree[x].rsum #define dat(x) tree[x].dat int read() { int s=0,w=1; char c=getchar(); while(c<'0' || c>'9') { if(c=='-') w=-1; c=getchar(); } while(c>='0' && c<='9') { s=(s<<3)+(s<<1)+(c^48); c=getchar(); } return s*w; } void update(int p) { sum(p)=sum(p<<1)+sum(p<<1|1); lsum(p)=max(lsum(p<<1),sum(p<<1)+lsum(p<<1|1)); rsum(p)=max(rsum(p<<1|1),sum(p<<1|1)+rsum(p<<1)); dat(p)=max({dat(p<<1),dat(p<<1|1),rsum(p<<1)+lsum(p<<1|1)}); } void build(int p,int l,int r) { l(p)=l,r(p)=r; if(l(p)==r(p)){ sum(p)=lsum(p)=rsum(p)=dat(p)=read(); return; } int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); update(p); } void change(int p,int addr,int c) { if(l(p)==r(p)) { sum(p)=lsum(p)=rsum(p)=dat(p)=c; return; } int mid=(l(p)+r(p))>>1; if(addr<=mid) change(p<<1,addr,c); else if(addr>mid) change(p<<1|1,addr,c); update(p); } segment_tree ask(int p,int l,int r) { if(l<=l(p) && r>=r(p)) return tree[p]; int ans=0xc0c0c0c0; int mid=(l(p)+r(p))>>1; if(r<=mid) return ask(p<<1,l,r); if(l>mid) return ask(p<<1|1,l,r); else{ segment_tree x,y,ans; x=ask(p<<1,l,r),y=ask(p<<1|1,l,r); ans.sum=x.sum+y.sum; ans.lsum=max(x.lsum,x.sum+y.lsum); ans.rsum=max(y.rsum,y.sum+x.rsum); ans.dat=max({x.dat,y.dat,x.rsum+y.lsum}); return ans; }
} int k,a,b; int main() { n=read(),m=read(); build(1,1,n); for(int i=1;i<=m;i++) { k=read(); if(k==1) { a=read(),b=read(); if(a>b) swap(a,b); printf("%d\n",ask(1,a,b).dat); } else if(k==2) { a=read(),b=read(); change(1,a,b); } } return 0; }
|