注意每次测试数据后的数据清空
int a[maxn]; //原数组
struct node{
int l,r;
ll s,lazy;
void update(ll k){
s+=(r-l+1)*k;
lazy+=k;
}
}tree[4*maxn];
void push_down(int id){
if(tree[id].lazy){
tree[id*2].update(tree[id].lazy);
tree[id*2+1].update(tree[id].lazy);
tree[id].lazy=0;
}
}
void push_up(int id)
{
tree[id].s=tree[id*2].s+tree[id*2+1].s;
}
void build(int id,int l,int r){
tree[id].l=l;
tree[id].r=r;
tree[id].lazy = 0;
if(l==r){
tree[id].s=a[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
push_up(id);
}
void update(int id,int l,int r,int k){
int L=tree[id].l,R=tree[id].r;
if(R<l||L>r)
return;
if(l<=L&&R<=r){
tree[id].update(k);
return;
}
push_down(id);
if(tree[id*2].r>=l)
update(id*2,l,r,k);
if(tree[id*2+1].l<=r)
update(id*2+1,l,r,k);
push_up(id);
}
ll query(int id,int l,int r){
int L=tree[id].l,R=tree[id].r;
ll res=0;
if(R<l||L>r)
return 0;
if(l<=L&&R<=r)
return tree[id].s;
push_down(id);
if(tree[id*2].r>=l)
res+=query(id*2,l,r);
if(tree[id*2+1].l<=r)
res+=query(id*2+1,l,r);
return res;
}