#include <iostream>
#include <cstdio>
using namespace std;
#define maxn1 10000000
#define maxn2 100005
typedef struct
{
int l,r;
long long sum,store;
}Tree;
Tree tree[maxn1];
long long v[maxn2];
long long sum;
void build(int l,int r,int pos) //在建树时,同时将数组中数存到各个节点的sum中
{
tree[pos].l=l;
tree[pos].r=r;
tree[pos].store=0;
if(l==r)
{
tree[pos].sum=v[l];
return;
}
int mid=(l+r)/2;
build(l,mid,pos*2);
build(mid+1,r,pos*2+1);
tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
}
void insert(int l,int r,int pos,long long num)
{
if(tree[pos].l>=l&&tree[pos].r<=r)
{
tree[pos].store+=num;
return;
}
else if(tree[pos].l<=l&&tree[pos].r>=r)
{
tree[pos].sum+=(r-l+1)*num;
}
else if(tree[pos].l<=l&&tree[pos].r<=r)
{
tree[pos].sum+=(tree[pos].r-l+1)*num;
}
else if(tree[pos].l>=l&&tree[pos].r>=r)
{
tree[pos].sum+=(r-tree[pos].l+1)*num;
}
int mid=(tree[pos].r+tree[pos].l)/2;
if(mid>=l)
{
insert(l,r,2*pos,num);
}
if(mid+1<=r)
{
insert(l,r,2*pos+1,num);
}
}
void Search(int l,int r,int pos)
{
if(l<=tree[pos].l&&tree[pos].r<=r)
{
sum+=tree[pos].sum+(tree[pos].r-tree[pos].l+1)*tree[pos].store;
return;
}
else
{
tree[pos*2].store+=tree[pos].store;
tree[pos*2+1].store+=tree[pos].store;
tree[pos].sum+=(tree[pos].r-tree[pos].l+1)*tree[pos].store;
tree[pos].store=0;
}
int mid=(tree[pos].l+tree[pos].r)/2;
if(mid>=l)
{
Search(l,r,pos*2);
}
if(mid+1<=r)
{
Search(l,r,pos*2+1);
}
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
//while(scanf("%d%d",&n,&q)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
scanf("%lld",&v[i]);
build(1,n,1);
while(q--)
{
int a,b;
char ch;
long long c;
getchar();
scanf("%c%d%d",&ch,&a,&b);
if(ch=='Q')
{
sum=0;
Search(a,b,1);
printf("%lld\n",sum);
}
else
{
scanf("%lld",&c);
insert(a,b,1,c);
}
}
}
return 0;
}
疯掉了,在修改的时候居然把r-l写成了l-r,还找了那么长时间,下次要仔细哦!