线段树基础,用lazy延迟处理,一开始移位的时候,范了几个错误,汗!!!,调了半天,测试数据终于出来正确结果啦,然后看提示改成64位整型,没考虑中间过程会溢出,又wrong了,看来数据还是蛮强大的,最后把中间强制转换才过了。各种悲剧。。。。。。
ACcode:
#include<math.h>
#include<stdio.h>
#include<string.h>
#define LL __int64
const int size=100000;
LL sum[300000];
int lazy[300000];
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int k)
{
if (lazy[rt])
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
sum[rt<<1]+=(LL)(k-(k>>1))*lazy[rt];
sum[rt<<1|1]+=(LL)((k>>1))*lazy[rt];
lazy[rt]=0;
}
}
void build(int rt,int l,int r)
{
lazy[rt]=0;
if (l==r)
{
scanf("%I64d",sum+rt);
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int L,int R,int v)
{
if (L<=l&&r<=R)
{
lazy[rt]+=v;
sum[rt]+=(LL)(v)*(r-l+1);
return ;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if (L<=mid) update(rt<<1,l,mid,L,R,v);
if (R>mid) update(rt<<1|1,mid+1,r,L,R,v);
pushup(rt);
}
LL query(int rt,int l,int r,int L,int R)
{
if (L<=l&&r<=R) return sum[rt];
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
LL ans=0;
if (L<=mid) ans+=query(rt<<1,l,mid,L,R);
if (R>mid) ans+=query(rt<<1|1,mid+1,r,L,R);
return ans;
}
int main()
{
char str[5];
int n,m,x,y,v;
while (~scanf("%d %d",&n,&m))
{
build(1,0,n-1);
while (m--)
{
scanf("%s",str);
if (str[0]=='C')
{
scanf("%d %d %d",&x,&y,&v);
if (x>y) x=x^y,y=x^y,x=x^y;
update(1,0,n-1,x-1,y-1,v);
}
else
{
scanf("%d %d",&x,&y);
if (x>y) x=x^y,y=x^y,x=x^y;
printf("%I64d\n",query(1,0,n-1,x-1,y-1));
}
}
}
return 0;
}