#include<bits/stdc++.h>//分块模板新 http://poj.org/problem?id=3468
#define maxn 100010
using namespace std;
inline int read()
{
int x=0;
char c;
while(!isdigit(c))
c=getchar();
while(isdigit(c))
{
x=(x<<3)+(x<<1)+(c-48);
c=getchar();
}
return x;
}
int origin[maxn];
int gro[maxn];
int head[maxn];
int end[maxn];
int add[maxn];
int sum[maxn];
#define gx gro[x]
#define gy gro[y]
void query()
{
int x;
int y;
x=read();
y=read();
int sumx=0;
int sumy=0;
int sumtot=0;
if(gx!=gy)
{
if(x!=head[gx])
for(int i=x;i<=end[gx];i++)
sumx+=origin[i]+add[gx];
else
sumx=sum[gx]+(end[gx]-head[gx]+1)*add[gx];
if(y!=end[gy])
for(int i=head[gx];i<=y;i++)
sumy+=origin[i]+add[gy];
else
sumy=sum[gy]+(end[gy]-head[gy]+1)*add[gy];
for(int i=gx+1;i<=gy-1;i++)
sumtot+=sum[i]+(end[i]-head[i]+1)*add[i];
}
else
{
for(int i=x;i<=y;i++)
{
sumtot+=origin[i]+add[gx];
}
}
cout<<sumx+sumtot+sumy<<endl;
}
void change()
{
int x;
int y;
int num;
x=read();
y=read();
num=read();
if(gx!=gy)
{
if(x!=head[gx])
{
for(int i=x;i<=end[gx];i++)
origin[i]+=num;
sum[gx]+=(end[gx]-x+1)*num;
}
else
add[gx]+=num;
if(y!=end[gy])
{
for(int i=head[gy];i<=y;i++)
origin[i]+=num;
sum[gy]+=(y-head[gy]+1)*num;
}
else
add[gy]+=num;
for(int i=gx+1;i<=gy-1;i++)
add[i]+=num;
}
else
{
for(int i=x;i<=y;i++)
origin[i]+=num;
sum[gx]+=(y-x+1)*num;
}
}
int main()
{
int n;
n=read();
for(int i=1;i<=n;i++)
origin[i]=read();
int len=(int)sqrt(n);
int tot=len;
for(int i=1;i<=tot;i++)
{
head[i]=(i-1)*len+1;
end[i]=i*len;
}
if(end[tot]!=n)
{
tot++;
head[tot]=end[tot-1]+1;
end[tot]=n;
}
for(int i=1;i<=tot;i++)
for(int j=head[i];j<=end[i];j++)
{
gro[j]=i;
sum[i]+=origin[j];
}
int m;
m=read();
for(int i=1;i<=m;i++)
{
char c;
c=read();
if(c=='Q')
query();
if(c=='C')
change();
}
return 0;
}
本人分块模板,区间修改+区间求和 时间复杂度大约O(m*3*log_2*n))