SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

Can you answer these queries III

 SPOJ - GSS3 

 

这道题和洛谷的小白逛公园一样的题目。

传送门:

洛谷 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 }

 

posted @ 2019-04-09 21:27  ZERO-  阅读(153)  评论(0编辑  收藏  举报