描述
河蟹王国有一位河蟹国王,他的名字叫羊驼。河蟹王国富饶安定,人们和谐相处。有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人。于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀)。每个人都有一个初始的和谐值。羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选出的人。而且,在某一时间,区间[L’,R’]里的人会变得熟悉,因此他们每个人的和谐值都会上升一个相同的值C。羊驼国王想知道,对于每一次选择,他选出的最大和谐值是多少。
输入格式
第一行是一个数N(1<=N<=100000),表示人数。
接下来的N行,每行一个数,表示排成的序列第i个人和谐值的初始值。
接下来是一个数M(1<=M<=100000),表示羊驼国王或他的子民有所活动(羊驼国王选择一个区间算一次,某区间里的人增长和谐值算一次)的总次数。
接下来的M行,每行第一个是一个数K,K是1或2,若K=1,接下来有三个数L,R,C,表示区间[L,R]的所有人增加C的和谐值;若K=2,接下来有两个数L,R,表示国王选择了区间[L,R]。
输出格式
每次对于国王选择区间,输出选择区间里的最大和谐值。
样例输入
5
1
2
3
4
5
3
2 1 4
1 1 3 3
2 3 5
样例输出
4
6
限制
每个测试点1s。
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <ctime> 5 #include <iostream> 6 #include <algorithm> 7 #include <set> 8 #include <vector> 9 #include <queue> 10 #include <typeinfo> 11 #include <map> 12 #include <stack> 13 typedef long long ll; 14 using namespace std; 15 inline ll read() 16 { 17 ll x=0,f=1; 18 char ch=getchar(); 19 while(ch<'0'||ch>'9') 20 { 21 if(ch=='-')f=-1; 22 ch=getchar(); 23 } 24 while(ch>='0'&&ch<='9') 25 { 26 x=x*10+ch-'0'; 27 ch=getchar(); 28 } 29 return x*f; 30 } 31 //************************************************************************************** 32 struct ss 33 { 34 int l,r,v,tag; 35 }tr[100001*4]; 36 int n,a[100005]; 37 void build(int k,int l,int r) 38 { 39 tr[k].l=l; 40 tr[k].r=r; 41 if(l==r) {tr[k].v=a[l];return ;} 42 int mid=(l+r)>>1; 43 build(k<<1,l,mid); 44 build(k<<1|1,mid+1,r); 45 // tr[k].v=tr[k<<1].v+tr[k<<1|1].v; 46 tr[k].v=max(tr[k<<1].v,tr[k<<1|1].v); 47 } 48 void pushdown(int k) 49 { 50 tr[k<<1].tag+=tr[k].tag; 51 tr[k<<1|1].tag+=tr[k].tag; 52 tr[k<<1].v+=tr[k].tag; 53 tr[k<<1|1].v+=tr[k].tag; 54 tr[k].tag=0; 55 } 56 void update(int k,int l,int r,int x) 57 { 58 if(l==tr[k].l&&r==tr[k].r) 59 { 60 tr[k].tag+=x; 61 tr[k].v+=x; 62 return; 63 } 64 if(tr[k].tag) pushdown(k); 65 int mid=(tr[k].l+tr[k].r)>>1; 66 if(r<=mid)update(k<<1,l,r,x); 67 else if(l>mid)update(k<<1|1,l,r,x); 68 else { 69 update(k<<1,l,mid,x); 70 update(k<<1|1,mid+1,r,x); 71 } 72 tr[k].v=max(tr[k<<1].v,tr[k<<1|1].v); 73 } 74 int ask(int k,int l,int r) 75 { 76 if(l==tr[k].l&&tr[k].r==r) 77 { 78 return tr[k].v; 79 } 80 if(tr[k].tag) pushdown(k); 81 int mid=(tr[k].l+tr[k].r)>>1; 82 if(r<=mid) return ask(k<<1,l,r); 83 else if(l>mid)return ask(k<<1|1,l,r); 84 else { 85 return max(ask(k<<1,l,mid),ask(k<<1|1,mid+1,r)); 86 } 87 } 88 int main() 89 { 90 91 scanf("%d",&n); 92 for(int i=1;i<=n;i++) 93 { 94 scanf("%d",&a[i]); 95 } 96 build(1,1,n); 97 int q; 98 scanf("%d",&q); 99 for(int i=1;i<=q;i++) 100 { 101 int t; 102 scanf("%d",&t); 103 if(t==2) 104 { 105 int x,y; 106 scanf("%d%d",&x,&y); 107 printf("%d ",ask(1,x,y)); 108 } 109 else { 110 int x;int y;int c; 111 scanf("%d%d%d",&x,&y,&c); 112 update(1,x,y,c); 113 } 114 } 115 return 0; 116 }