#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100010;
int n,m;
struct node
{
int sum,t;
int l,r;
}tr[N*4];
int a[N];
void settag(int p,int tag)
{
tr[p].sum+=tag*(tr[p].r-tr[p].l+1);
tr[p].t+=tag;
}
void pushdown(int p)
{
if(tr[p].t)
{
tr[2*p].sum+=tr[p].t*(tr[2*p].r-tr[2*p].l+1);
tr[2*p].t+=tr[p].t;
tr[2*p+1].sum+=tr[p].t*(tr[2*p+1].r-tr[2*p+1].l+1);
tr[2*p+1].t+=tr[p].t;
tr[p].t=0;
}
}
void update(int p)
{
tr[p].sum=(tr[2*p].sum+tr[2*p+1].sum);
}
void build(int p,int l,int r)
{
tr[p].l=l;tr[p].r=r;tr[p].t=0;
if(l==r){
tr[p].sum=a[l];
}else{
int mid=(l+r)/2;
build(2*p,l,mid);
build(2*p+1,mid+1,r);
update(p);
}
}
void modify(int p,int l,int r,int ql,int qr,int tag)
{
if(ql==l&&qr==r)
{
settag(p,tag);
return ;
}
pushdown(p);
int mid=(l+r)/2;
if(qr<=mid) modify(2*p,l,mid,ql,qr,tag);
else if(ql>mid) modify(2*p+1,mid+1,r,ql,qr,tag);
else{
modify(2*p,l,mid,ql,mid,tag);
modify(2*p+1,mid+1,r,mid+1,qr,tag);
}
update(p);
}
int query(int p,int l,int r,int ql,int qr)
{
if(ql==l&&qr==r)
{
return tr[p].sum;
}
pushdown(p);
int mid=(l+r)/2;
if(qr<=mid) return query(2*p,l,mid,ql,qr);
else if(ql>mid) return query(2*p+1,mid+1,r,ql,qr);
else {
return query(2*p,l,mid,ql,mid)+
query(2*p+1,mid+1,r,mid+1,qr);
}
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--)
{
char op;
cin>>op;
if(op=='Q'){
int l,r;
cin>>l>>r;
int s=query(1,1,n,l,r);
cout<<s<<endl;
}else{
int l,r,d;
cin>>l>>r>>d;
modify(1,1,n,l,r,d);
}
}
return 0;
}
线段树2——区间修改
最新推荐文章于 2024-05-21 23:16:53 发布