比赛描述
输入
第一行两个整数n,m(0 <= n,m <= 100000),n表序列{A}的长度, m表操作的个数。
第二行有n 个整数ai(-10000 <= ai <= 10000)。
下面m行,每一行表示一个操作,一个操作表示为3个整数x, l, r(1 <= l <= r <= n, |x|<=1000)。
输出
输出结果序列。数据已改正,行末没有空格!
样例输入
5 3
1 2 3 -4 5
2 1 1
-3 3 5
0 1 5
样例输出
3 2 0 -7 2
提示
null
题目来源
NUPT
#include<iostream> #define N 100001 struct tTreeNode{ int l,r,num; }node[N<<2]; void build(int i, int l, int r){ node[i].num = 0; node[i].l = l; node[i].r = r; if(l==r){ return; } int mid = (l+r)>>1; build((i<<1)+1,l,mid); build((i+1)<<1,mid+1,r); } void add(int i, int l, int r, int num){ if(node[i].l==l && node[i].r==r){ node[i].num += num; return; } int lChild=(i<<1)+1; int rChild=(i+1)<<1; int mid=(node[i].l+node[i].r)>>1; int temp; if(mid>=l){ temp = node[lChild].r; if(temp>r){ temp = r; } add(lChild,l,temp,num); } if(mid+1<=r){ temp=node[rChild].l; if(temp<l){ temp = l; } add(rChild,temp,r,num); } } void print(int i){ if(node[i].l == node[i].r){ if(node[i].l != 1){ putchar(' '); } printf("%d",node[i].num); return; } int lChild=(i<<1)+1; int rChild=(i+1)<<1; int temp=node[i].num; node[(i<<1)+1].num += temp; node[(i+1)<<1].num += temp; node[i].num = 0; print(lChild); print(rChild); } int main(){ // freopen("test.txt","r",stdin); int n,m,i,l,r,num; scanf("%d%d",&n,&m); build(0,1,n); for(i=1;i<=n;i++){ scanf("%d",&num); add(0,i,i,num); } for(i=1;i<=m;i++){ scanf("%d%d%d",&num,&l,&r); add(0,l,r,num); } print(0); putchar('\n'); }