这里更新一份SegTree的板子
class Seg{
private:
#define ls p<<1
#define rs p<<1|1
struct point{
ll sum;
ll lz;
}tr[N<<2];
void pushdown(int p,int l,int r){
if(tr[p].lz){
int mid=(l+r)/2;
tr[ls].sum += tr[p].lz*(mid-l+1);
tr[rs].sum += tr[p].lz*(r-mid);
tr[ls].lz += tr[p].lz;
tr[rs].lz += tr[p].lz;
tr[p].lz=0;
}
return;
}
void pushup(int p){
tr[p].sum=tr[ls].sum+tr[rs].sum;
}
void build(int p,int l,int r){
tr[p].lz=0;
if(l==r){
tr[p].sum=c[l];
return;
}
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void update(int p,int l,int r,int L,int R,int val){
if(L<=l && r<=R){
tr[p].sum += val*(r-l+1);
tr[p].lz += val;
return;
}
pushdown(p,l,r);
int mid=(l+r)/2;
if(L<=mid) update(ls,l,mid,L,R,val);
if(R>mid) update(rs,mid+1,r,L,R,val);
pushup(p);
}
ll ask(int p,int l,int r,int L,int R){
if(L<=l && r<=R){
return tr[p].sum;
}
pushdown(p,l,r);
int mid=(l+r)/2;
ll ret=0;
if(L<=mid) ret+=ask(ls,l,mid,L,R);
if(R>mid) ret+=ask(rs,mid+1,r,L,R);
return ret;
}
#undef ls
#undef rs
public:
int sz;
void init(int siz,int arr[]){
sz=siz;
for(int i=1;i<=sz;i++){
c[i]=arr[i];
}
build(1,1,sz);
}
ll query(int l,int r){
return ask(1,1,sz,l,r);
}
void add(int l,int r,int val){
update(1,1,sz,l,r,val);
}
}seg;