题目链接:
http://poj.org/problem?id=3468
题意:
操作,给区间加上某个值或区间修改。
代码:
#include
#include
#include
#define lson (id*2)
#define rson (id*2+1)
using namespace std;
long long tr[800005],lazy[800005],a[100005],ans;
void pushup(int id)
{ tr[id]=tr[lson]+tr[rson]; }
void pushdown(int id,int l,int r)
{
int mid=(l+r)/2;
tr[lson]+=lazy[id]*(mid-l+1);
tr[rson]+=lazy[id]*(r-mid);
lazy[lson]+=lazy[id];
lazy[rson]+=lazy[id];
lazy[id]=0;
}
void build(int id,int l,int r)
{
if (l>r) return ;
if (l==r) {tr[id]=a[l]; return ;}
int mid=(l+r)/2;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(id);
}
void add(int id,int l,int r,int L,int R,long long c)
{
if (l>r || l>R || rreturn ;
if (l>=L && r<=R)
{
tr[id]+=(r-l+1)*c;
lazy[id]+=c;
return ;
}
int mid=(l+r)/2;
pushdown(id,l,r);
if (L<=mid) add(lson,l,mid,L,R,c);
if (R>=mid+1) add(rson,mid+1,r,L,R,c);
pushup(id);
}
void query(int id,int l,int r,int L,int R)
{
if (l>r || l>R || rreturn ;
if (l>=L && r<=R)
{
ans+=tr[id];
return ;
}
int mid=(l+r)/2;
pushdown(id,l,r);
if (L<=mid) query(lson,l,mid,L,R);
if (R>=mid+1) query(rson,mid+1,r,L,R);
pushup(id);
}
int n,m,x,y,c;
char p[5];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for (int i=1;i<=m;i++)
{
scanf("%s",p);
if (p[0]=='C')
{
scanf("%d%d%d",&x,&y,&c);
add(1,1,n,x,y,c);
}
else
{
ans=0;
scanf("%d%d",&x,&y);
query(1,1,n,x,y);
printf("%lld\n",ans);
}
}
}