Can you answer these queries III
这道题和洛谷的小白逛公园一样的题目。
传送门:
洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=5e4+10; 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 8 struct Tree{ 9 int pre,suf,sub,val; 10 }tree[maxn<<2]; 11 12 Tree pushup(Tree l,Tree r) 13 { 14 Tree rt; 15 rt.pre=max(l.pre,l.val+r.pre); 16 rt.suf=max(r.suf,r.val+l.suf); 17 rt.sub=max(max(l.sub,r.sub),l.suf+r.pre); 18 rt.val=l.val+r.val; 19 return rt; 20 } 21 22 void build(int l,int r,int rt) 23 { 24 if(l==r){ 25 scanf("%d",&tree[rt].val); 26 tree[rt].pre=tree[rt].suf=tree[rt].sub=tree[rt].val; 27 return ; 28 } 29 30 int m=(l+r)>>1; 31 build(lson); 32 build(rson); 33 tree[rt]=pushup(tree[rt<<1],tree[rt<<1|1]); 34 } 35 36 void update(int pos,int c,int l,int r,int rt) 37 { 38 if(l==r){ 39 tree[rt].pre=tree[rt].suf=tree[rt].sub=tree[rt].val=c; 40 return ; 41 } 42 43 int m=(l+r)>>1; 44 if(pos<=m) update(pos,c,lson); 45 if(pos> m) update(pos,c,rson); 46 tree[rt]=pushup(tree[rt<<1],tree[rt<<1|1]); 47 } 48 49 Tree query(int L,int R,int l,int r,int rt) 50 { 51 if(L<=l&&r<=R){ 52 return tree[rt]; 53 } 54 55 int m=(l+r)>>1; 56 Tree ret,lret,rret; 57 int flag1=0,flag2=0; 58 if(L<=m) {lret=query(L,R,lson);flag1=1;} 59 if(R> m) {rret=query(L,R,rson);flag2=1;} 60 61 if(flag1&&flag2) ret=pushup(lret,rret); 62 else if(flag1) ret=lret; 63 else if(flag2) ret=rret; 64 return ret; 65 } 66 67 int main() 68 { 69 int n; 70 scanf("%d",&n); 71 build(1,n,1); 72 int m; 73 scanf("%d",&m); 74 for(int i=1;i<=m;i++){ 75 int op,l,r; 76 scanf("%d%d%d",&op,&l,&r); 77 if(op==0){ 78 update(l,r,1,n,1); 79 } 80 else{ 81 Tree ans=query(l,r,1,n,1); 82 printf("%d\n",ans.sub); 83 } 84 } 85 return 0; 86 }