#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
struct point
{
long long l;
long long r;
long long w;
long long m;
}p[400002];
void init(ll l,ll r,ll k)
{
p[k].l=l;
p[k].r=r;
p[k].w=0;
p[k].m=0;
if(l==r)
return ;
ll m=(l+r)/2;
init(l,m,2*k);
init(m+1,r,2*k+1);
}
ll ans;
void query(ll l,ll r,ll k)
{
if(p[k].l==l&&p[k].r==r)
{
ans+=p[k].w;
return ;
}
if(p[k].m)
{
p[2*k].w+=(p[2*k].r-p[2*k].l+1)*p[k].m;
p[2*k].m=p[2*k].m+p[k].m;
p[2*k+1].w+=(p[2*k+1].r-p[2*k+1].l+1)*p[k].m; //当时少了一个加号,错的一塌糊涂
p[2*k+1].m+=p[k].m;
p[k].m=0;
}
ll m=(p[k].l+p[k].r)/2;
if(l>m)
{
query(l,r,2*k+1);
}
else if(r<=m)
{
query(l,r,2*k);
}
else
{
query(l,m,2*k);
query(m+1,r,2*k+1);
}
}
void change(ll l,ll r,ll k,ll w)
{
if(p[k].l==l&&p[k].r==r)
{
p[k].w+=w*(r-l+1);
p[k].m+=w;
return ;
}
ll m=(p[k].l+p[k].r)/2;
p[k].w+=(r-l+1)*w;
if(r<=m)
{
change(l,r,2*k,w);
}
else if(l>m)
{
change(l,r,2*k+1,w);
}
else
{
change(l,m,2*k,w);
change(m+1,r,2*k+1,w);
}
}
int main()
{
std::ios::sync_with_stdio(false);
ll n,m;
cin>>n>>m;
init(1,n,1);
ll i,j;
char ch;
long long x,y,z;
for(i=1;i<=n;i++)
{
cin>>x;
change(i,i,1,x);
}
for(i=0;i<m;i++)
{
cin>>ch;
if(ch=='Q')
{
cin>>x>>y;
ans=0;
query(x,y,1);
cout<<ans<<endl;
}
else if(ch=='C')
{
cin>>x>>y>>z;
change(x,y,1,z);
}
}
}
poj 3468 A Simple Problem with Integers 线段树
最新推荐文章于 2019-08-06 11:24:00 发布