链接:http://www.acm.uestc.edu.cn/problem.php?pid=1225&cid=211
#include <iostream>
#include <cstdio>
using namespace std;
struct node
{
int l,r;
long long v,add;
}a[4*1100000];
int dp[1100000],n,m;
long long max(long long int x,long long int y)
{
if(x>y) return x;
return y;
}
void build(int l,int r,int ans)
{
a[ans].l=l;a[ans].r=r;
if(l==r){ a[ans].v=dp[l];a[ans].add=0;return;}
int mid=(l+r)>>1;
build(l,mid,ans*2);
build(mid+1,r,ans*2+1);
a[ans].v=a[ans*2].v+a[ans*2+1].v;
}
long long query(int l,int r,int ans)
{
if(a[ans].l==l && a[ans].r==r) return a[ans].v+a[ans].add;
int mid=(a[ans].l+a[ans].r)>>1;
a[ans*2].add+=(mid-a[ans].l+1)*(a[ans].add/(a[ans].r-a[ans].l+1));
a[ans*2+1].add+=(a[ans].r-mid)*(a[ans].add/(a[ans].r-a[ans].l+1));
a[ans].add=0;
long long ret;
if(l>=mid+1) ret=query(l,r,ans*2+1);
else if(r<=mid) ret=query(l,r,ans*2);
else ret=query(l,mid,ans*2)+query(mid+1,r,ans*2+1);
a[ans].v=a[ans*2].v+a[ans*2].add+a[ans*2+1].v+a[ans*2+1].add;
return ret;
}
void insert(int l,int r,long long x,int ans)
{
if(a[ans].l==l && a[ans].r==r)
{
a[ans].add+=x*(a[ans].r-a[ans].l+1);
return;
}
int mid=(a[ans].l+a[ans].r)>>1;
a[ans*2].add+=(mid-a[ans].l+1)*(a[ans].add/(a[ans].r-a[ans].l+1));
a[ans*2+1].add+=(a[ans].r-mid)*(a[ans].add/(a[ans].r-a[ans].l+1));
a[ans].add=0;
if(l>=mid+1) insert(l,r,x,ans*2+1);
else if(r<=mid) insert(l,r,x,ans*2);
else
{
insert(l,mid,x,ans*2);
insert(mid+1,r,x,ans*2+1);
}
a[ans].v=a[ans*2].v+a[ans*2].add+a[ans*2+1].v+a[ans*2+1].add;
}
int main()
{
//freopen("text.in","r",stdin);
//freopen("text.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d",&dp[i]);
}
build(1,n,1);
while(m--)
{
char ch[2];
int l,r,x;
scanf("%s%d%d",ch,&l,&r);
if(l<1) l=1;
if(r>n) r=n;
if(ch[0]=='Q')
{
printf("%lld\n",query(l,r,1));
}
else
{
scanf("%d",&x);
insert(l,r,x,1);
}
}
return 0;
}