模板。不说了。去吃饭啦啦啦啦啦啦啦啦啦啦啦。
#include <cstring>
#include <cstdio>
#define m(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N=300005;
ll ans[N],tag[N];
void build(int l,int r,int pos)
{
if(l==r)
{
scanf("%lld",&ans[pos]);
return;
}
int mid=(l+r)>>1;
build(l,mid,pos<<1);
build(mid+1,r,pos<<1|1);
ans[pos]=ans[pos<<1]+ans[pos<<1|1];
}
void pushdown(int ln,int rn,int pos)
{
if(!tag[pos])
return;
tag[pos<<1]+=tag[pos];
tag[pos<<1|1]+=tag[pos];
ans[pos<<1]+=tag[pos]*(ll)(ln);
ans[pos<<1|1]+=tag[pos]*(ll)(rn);
tag[pos]=0;
}
void chanpoint(int n,ll val,int l,int r,int pos)
{
if(l==r)
ans[pos]=val;
int mid=(l+r)>>1;
if(n<=mid)
chanpoint(n,val,l,mid,pos<<1);
else
chanpoint(n,val,mid+1,r,pos<<1|1);
ans[pos]=ans[pos<<1]+ans[pos<<1|1];
}
void chanspan(int cl,int cr,ll val,int l,int r,int pos)
{
if(cl<=l&&r<=cr)
{
ans[pos]+=val*(ll)(r-l+1);
tag[pos]+=val;
return;
}
int mid=(l+r)>>1;
pushdown(mid-l+1,r-mid,pos);
if(cl<=mid)
chanspan(cl,cr,val,l,mid,pos<<1);
if(cr>mid)
chanspan(cl,cr,val,mid+1,r,pos<<1|1);
ans[pos]=ans[pos<<1]+ans[pos<<1|1];
}
ll query(int cl,int cr,int l,int r,int pos)
{
if(cl<=l&&r<=cr)
return ans[pos];
int mid=(l+r)>>1;
pushdown(mid-l+1,r-mid,pos);
ll ans=0;
if(cl<=mid)
ans+=query(cl,cr,l,mid,pos<<1);
if(cr>mid)
ans+=query(cl,cr,mid+1,r,pos<<1|1);
return ans;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(1,n,1);
m(tag,0);
int a,b;
char ch;
ll c;
while(m--)
{
getchar();
scanf("%c",&ch);
if(ch=='Q')
{
scanf("%d%d",&a,&b);
printf("%lld\n",query(a,b,1,n,1));
}
else
{
scanf("%d%d%lld",&a,&b,&c);
chanspan(a,b,c,1,n,1);
}
}
}