在一個荒涼的墓地上ui
有一個使人尊敬的守墓人, 他看守的墓地歷來spa
沒有被盜過, 因此人們很放心的把本身的先人的墓code
安頓在他那blog
守墓人能看好這片墓地是必然而不是偶然.....io
由於....守墓人懂風水 0.0class
他把墓地分爲主要墓碑和次要墓碑, 主要墓碑統計
只能有 1 個, 守墓人把他記爲 1 號, 而次要墓碑有數據
n-1 個,守墓人將之編號爲 2,3...n,因此構成了一個有 n 個墓碑的墓地。查詢
而每一個墓碑有一個初始的風水值,這些風水值決定了墓地的風水的好壞,因此守墓人di
須要常常來查詢這些墓碑。
善於運用風水的守墓人,經過一次次逆天改命,使得本身擁有了無限壽命,沒人知道
他活了多久。
這天,你幸運的拜訪到了他,他要求你和他共同見證接下來幾年他的戰果,但不過他
每次統計風水值之和都須要你來幫他計算,算錯了他會要你命 QAQ
風水也不是不可變,除非遭遇特殊狀況,已知在接下來的 2147483647 年裏,會有 n 次
災難,守墓人會有幾個操做:
1.將[l,r]這個區間全部的墓碑的風水值增長 k。
2.將主墓碑的風水值增長 k
3.將主墓碑的風水值減小 k
4.統計[l,r]這個區間全部的墓碑的風水值之和
5.求主墓碑的風水值
上面也說了,不少人會把先人的墓安居在這裏,並且守墓人活了不少世紀→_→,墓碑
的數量會多的你不敢相信= =
守墓人和藹的邀請你幫他完成這些操做,要否則哪天你的旅館爆炸了,天上下刀子.....
爲了活命,仍是幫他吧
第一行,兩個正整數 n,f 表示共有 n 塊墓碑,而且在接下來的
2147483647 年裏,會有 f 次世界末日
第二行,n 個正整數,表示第 i 塊墓碑的風水值
接下來 f 行,每行都會有一個針對世界末日的解決方案,如題所述,標記同題
輸出格式:輸出會有若干行,對 4 和 5 的提問作出回答
5 7 0 0 0 0 0 1 1 5 1 1 1 3 3 2 3 3 1 4 1 5 2 1 5
16 7
20%的數據知足:1≤n≤100
50%的數據知足:1≤n≤6000
100%的數據知足:1≤n,f≤2*10^5
線段樹;
1 #include<cstdio> 2 #define LL long long 3 const int maxn=2e5+10; 4 inline LL min_(LL x,LL y){return x<y?x:y;} 5 inline LL max_(LL x,LL y){return x>y?x:y;} 6 int n,m; 7 LL t[maxn<<2],f[maxn<<2]; 8 void build(int k,int l,int r){ 9 if(l==r){ 10 scanf("%lld",&t[k]); 11 return; 12 } 13 int mid=l+r>>1,ls=k<<1,rs=ls|1; 14 build(ls,l,mid); 15 build(rs,mid+1,r); 16 t[k]=t[ls]+t[rs]; 17 } 18 void down(int k,int l,int r){ 19 int mid=l+r>>1,ls=k<<1,rs=ls|1; 20 t[ls]+=(mid-l+1)*f[k]; 21 t[rs]+=(r-mid)*f[k]; 22 f[ls]+=f[k]; 23 f[rs]+=f[k]; 24 f[k]=0; 25 } 26 void change(int k,int l,int r,int al,int ar,LL x){ 27 if(l==al&&r==ar){ 28 t[k]+=(r-l+1)*x; 29 f[k]+=x; 30 return; 31 } 32 int mid=l+r>>1,ls=k<<1,rs=ls|1; 33 if(f[k]) down(k,l,r); 34 if(al<=mid) change(ls,l,mid,al,min_(ar,mid),x); 35 if(ar>mid) change(rs,mid+1,r,max_(al,mid+1),ar,x); 36 t[k]=t[ls]+t[rs]; 37 } 38 LL query(int k,int l,int r,int al,int ar){ 39 if(l==al&&r==ar) return t[k]; 40 int mid=l+r>>1,ls=k<<1,rs=ls|1; 41 LL ret=0; 42 if(f[k]) down(k,l,r); 43 if(al<=mid) ret+=query(ls,l,mid,al,min_(ar,mid)); 44 if(ar>mid) ret+=query(rs,mid+1,r,max_(al,mid+1),ar); 45 return ret; 46 } 47 int opt,l,r; 48 LL k; 49 int main(){ 50 scanf("%d%d",&n,&m); 51 build(1,1,n); 52 while(m--){ 53 scanf("%d",&opt); 54 if(opt==1){ 55 scanf("%d%d%lld",&l,&r,&k); 56 change(1,1,n,l,r,k); 57 } 58 if(opt==2){ 59 scanf("%lld",&k); 60 change(1,1,n,1,1,k); 61 } 62 if(opt==3){ 63 scanf("%lld",&k); 64 change(1,1,n,1,1,-k); 65 } 66 if(opt==4){ 67 scanf("%d%d",&l,&r); 68 printf("%lld\n",query(1,1,n,l,r)); 69 } 70 if(opt==5) printf("%lld\n",query(1,1,n,1,1)); 71 } 72 return 0; 73 }