给你一个n个元素的数组,然后对其进行m次区间修改,在 l~r 上加上 w。
输入:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出:
3 4 5 3 4 2
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define ls u<<1
#define rs ls|1
struct Node{
int l,r;
int sum,add;
}tr[N<<2];
int n,m;
int a[N];
void pushup(int u){
tr[u].sum=tr[ls].sum+tr[rs].sum;
}
void pushdown(int u){
if(tr[u].add){
tr[ls].add+=tr[u].add;
tr[rs].add+=tr[u].add;
tr[ls].sum+=(tr[ls].r-tr[ls].l+1)*tr[u].add;
tr[rs].sum+=(tr[rs].r-tr[rs].l+1)*tr[u].add;
tr[u].add=0;
}
}
void build(int u,int l,int r){
if(l==r)tr[u]={l,r,a[l]};
else{
int mid=l+r>>1;
tr[u]={l,r};
build(ls,l,mid),build(rs,mid+1,r);
pushup(u);
}
}
int query(int u,int l,int r){
if(l<=tr[u].l&&tr[u].r<=r)return tr[u].sum;
else{
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
int sum=0;
if(l<=mid)sum+=query(ls,l,r);
if(r>mid)sum+=query(rs,l,r);
return sum;
}
}
void modify(int u,int l,int r,int w){
if(l<=tr[u].l&&tr[u].r<=r){
tr[u].add+=w;
tr[u].sum+=(tr[u].r-tr[u].l+1)*w;
}else{
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)modify(ls,l,r,w);
if(r>mid)modify(rs,l,r,w);
pushup(u);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
int l,r,w;
cin>>l>>r>>w;
modify(1,l,r,w);
}
for(int i=1;i<=n;i++)cout<<query(1,i,i)<<" ";cout<<endl;
return 0;
}