UESTC 839

来源:互联网 发布:场控软件 编辑:程序博客网 时间:2024/06/06 03:44

B - 东风不与周郎便
Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu
Submit Status Practice UESTC 839
Appoint description: 

Description

“揽二乔于东南兮,乐朝夕之与共”

一首铜雀台赋,将愤怒与恐惧散播在了孙吴大军之中。

对抗曹军,万事俱备,只欠东风。

现在已经找到n个风眼,这些风眼的东风有强有弱,诸葛亮说他每次祈风都能够将一段风眼的东风增强,但需人去帮他布阵。同时他需要时刻掌控风眼的状况,以确定下一步的计划,所以还需要知道一段风眼的强度之和。

借东风,此乃逆天之术,施术者会折阳寿不说,布阵者更是会受十倍之伤。

“何人能当此任?”

“在下愿往,大都督。”

“你是?”

“在下一无名小卒,来自跳蚤街。”

Input

第一行两个整数nm,表示有n个风眼,诸葛亮一共祈风或询问了m次。

第二行n个整数,第i个数a_i表示第i个风眼已有东风的强度。

接下来m行,每行开始先读入一个整数s_i,指明这是一次询问还是一次祈风。

s_i = 0,表明这是一次询问,然后读入两个整数l_i,r_i,表示询问[l_i,r_i]区间中风眼的东风强度之和。

s_i = 1,表明这是一次祈风,然后读入三个整数l_i,r_i, w_i,表示把[l_i,r_i]区间中每个风眼的东风强度提升w_i

1 \leq n,m \leq 100000,0 \leq a_i \leq 10000,0 \leq w_i \leq 10000, 1 \leq l_i \leq r_i \leq n

Output

有多少询问就输出多少行,每行输出一个整数,作为对该询问的回答。

Sample Input

5 4 
1 2 3 4 5 
1 2 3 2 
0 3 4 
1 4 5 3 
0 2 4

Sample Output


16



换种风格写了一个线段树入门题,区间更新,区间查询


#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define lson L,mid,(rt<<1)#define rson mid+1,R,(rt<<1|1)#define N 140005#define LL long long LL ans;struct point{LL lc,rc;LL add;LL sum;LL mid(){return (lc+rc)>>1;}}tree[N<<2];void pushup(LL rt){tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;}void pushdown(LL rt){if(tree[rt].add){LL num=tree[rt].rc-tree[rt].lc+1;tree[rt<<1].sum+=tree[rt].add*(num-(num>>1));tree[rt<<1|1].sum+=tree[rt].add*((num>>1));tree[rt<<1|1].add+=tree[rt].add;tree[rt<<1].add+=tree[rt].add;tree[rt].add=0;}}void build(LL L,LL R,LL rt){tree[rt].lc=L;tree[rt].rc=R;tree[rt].add=0;if(L==R){scanf("%lld",&tree[rt].sum);return ;}LL mid=tree[rt].mid();build(lson);build(rson);pushup(rt);}void query(LL L,LL R,LL rt){if(tree[rt].lc==L&&tree[rt].rc==R){ans+=tree[rt].sum;return ;}pushdown(rt);LL mid=tree[rt].mid();if(R<=mid)query(L,R,rt<<1);else if(L>mid)query(L,R,rt<<1|1);else{query(lson);query(rson);}}void update(LL L,LL R,LL rt,LL v){if(tree[rt].lc==L&&tree[rt].rc==R){tree[rt].add+=v;tree[rt].sum+=(tree[rt].rc-tree[rt].lc+1)*v;return ;}pushdown(rt);LL mid=tree[rt].mid();if(R<=mid)update(L,R,rt<<1,v);else if(L>mid)update(L,R,rt<<1|1,v);else{update(lson,v);update(rson,v);}pushup(rt);}int main(){#ifdef CDZSCfreopen("i.txt","r",stdin);#endifLL n,m,x,y,k;LL v;while(~scanf("%lld%lld",&n,&m)){build(1,n,1);while(m--){scanf("%lld",&k);if(k==0){ans=0;scanf("%lld%lld",&x,&y);query(x,y,1);printf("%lld\n",ans);}else{scanf("%lld%lld%lld",&x,&y,&v);update(x,y,1,v);}}}return 0;}






0 0
原创粉丝点击