#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int qj[maxn];
struct xds{
int left;
int right;
int ans;
int lazy;
};
xds tr[4*maxn];
void build(int le,int ri,int x)
{
tr[x].lazy=0;
tr[x].left=le;
tr[x].right=ri;
if(le==ri)
{
tr[x].ans=qj[le];
return;
}
int mid=(le+ri)>>1;
build(le,mid,x<<1);
build(mid+1,ri,x<<1|1);
tr[x].ans=tr[x<<1].ans+tr[x<<1|1].ans;
return;
}
inline void push(int rt)
{
int k=tr[rt].lazy;tr[rt].lazy=0;
int le=rt<<1,ri=rt<<1|1;
tr[le].lazy+=k,tr[ri].lazy+=k;
tr[le].ans+=k*(tr[le].right-tr[le].left+1);
tr[ri].ans+=k*(tr[ri].right-tr[ri].left+1);
}
void xg(int x,int y,int k,int rt)
{
if(x>y) return;
if(x<=tr[rt].left&&tr[rt].right<=y)
{
tr[rt].lazy+=k;
tr[rt].ans+=k*(tr[rt].right-tr[rt].left+1);
return;
}
push(rt);
int mid=(tr[rt].left+tr[rt].right)>>1;
if(x<=mid)
xg(x,y,k,rt<<1);
if(y>mid)
xg(x,y,k,rt<<1|1);
tr[rt].ans=tr[rt<<1].ans+tr[rt<<1|1].ans;
return;
}
int js(int x,int y,int rt)
{
int ans=0;
if(x>y) return 0;
if(x<=tr[rt].left&&tr[rt].right<=y)
{
return tr[rt].ans;
}
push(rt);
int mid=(tr[rt].left+tr[rt].right)>>1;
if(x<=mid)
ans+=js(x,y,rt<<1);
if(y>mid)
ans+=js(x,y,rt<<1|1);
return ans;
}
signed main()
{
int n,m;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&qj[i]);
}
build(1,n,1);
scanf("%d",&m);
for(int ii=1;ii<=m;ii++)
{
char cz;
cin>>cz;
if(cz=='C')
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
xg(x,y,k,1);
}
else if(cz=='Q')
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",js(x,y,1));
}
}
return 0;
}
洛谷上能AC,但是效率不高,在另一个oj上超时了(答案正确),求优化