题意很好理解...
这题增量要用int64..增量可以为负...小心数据类型溢出...感觉自己写的lazy操作有点挫...应该说是搓成渣了....
不过能AC就好...WA了好多次 干脆都全部换成int64才过了....坑爹的题目
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
__int64 l,r,x;
__int64 sum;
}data[600200];
void build(__int64 l,__int64 r,__int64 k)
{
data[k].l=l;
data[k].r=r;
data[k].x=0;
if(l==r)
{
scanf("%I64d",&data[k].sum);
return ;
}
__int64 mid=(l+r)/2;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
data[k].sum=data[k<<1].sum+data[k<<1|1].sum;
}
void updata(__int64 l,__int64 r,__int64 k,__int64 add)
{
if(data[k].l==l&&data[k].r==r)
{
data[k].sum+=(__int64)add*(r-l+1);
data[k].x+=add;
return ;
}
__int64 mid=(data[k].l+data[k].r)/2;
updata(data[k].l,mid,k*2,data[k].x);
updata(mid+1,data[k].r,k*2+1,data[k].x);
data[k].x=0;
data[k].sum+=(r-l+1)*add;
if(l>mid)
updata(l,r,k*2+1,add);
else if(r<=mid)
updata(l,r,k*2,add);
else
{
updata(l,mid,k*2,add);
updata(mid+1,r,k*2+1,add);
}
}
__int64 query(__int64 l,__int64 r,__int64 k)
{
if(data[k].l==l&&data[k].r==r||data[k].l==data[k].r)
return data[k].sum;
__int64 ret=0;
__int64 mid=(data[k].l+data[k].r)/2;
if(data[k].x)
{
updata(data[k].l,mid,k*2,data[k].x);
updata(mid+1,data[k].r,k*2+1,data[k].x);
data[k].sum=data[k*2].sum+data[k*2+1].sum;
data[k].x=0;
}
if(l>mid)
ret+=query(l,r,k*2+1);
else if(r<=mid)
ret+=query(l,r,k*2);
else
ret+=query(l,mid,k*2)+query(mid+1,r,k*2+1);
return ret;
}
int main()
{
__int64 n,q;
scanf("%I64d %I64d",&n,&q);
build(1,n,1);
while(q--)
{
char op[5];
__int64 a,b,c;
scanf("%s",op);
if(op[0]=='Q')
{
scanf("%I64d %I64d",&a,&b);
printf("%I64d\n",query(a,b,1));
}
else
{
scanf("%I64d %I64d %I64d",&a,&b,&c);
updata(a,b,1,c);
}
}
return 0;
}