题目链接:
http://poj.org/problem?id=3468
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 10;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
long long sum[maxn << 2];
long long add[maxn << 2];
void pushUp(int rt)
{
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void pushDown(int rt, int len)
{
if(add[rt])
{
add[rt<<1] += add[rt];
add[rt<<1|1] += add[rt];
sum[rt<<1] += add[rt] * (len-(len>>1));
sum[rt<<1|1] += add[rt] *(len>>1);
add[rt] = 0;
}
}
void build(int l, int r, int rt)
{
add[rt] = 0;
if(l == r)
{
scanf("%lld", &sum[rt]);
return ;
}
int m = (l+r)>>1;
build(lson);
build(rson);
pushUp(rt);
}
void update(int L, int R, int c, int l, int r, int rt)
{
if(L<=l && r<=R)
{
add[rt] += (long long)c;
sum[rt] += (long long)c * (r-l+1);
return ;
}
pushDown(rt, r-l+1);
int m = (l+r)>>1;
if(L <= m)
update(L, R, c, lson);
if(R > m)
update(L, R, c, rson);
pushUp(rt);
}
long long query(int L, int R, int l, int r, int rt)
{
if(L<=l && r<=R)
return sum[rt];
pushDown(rt, r-l+1);
long long ans = 0;
int m = (l+r)>>1;
if(L <= m)
ans += query(L, R, lson);
if(R > m)
ans += query(L, R, rson);
pushUp(rt);
return ans;
}
int main()
{
int n, m, x, y, z;
while(~scanf("%d%d", &n, &m))
{
build(1, n, 1);
while(m--)
{
char s[10];
scanf("%s", s);
if(s[0] == 'Q')
{
scanf("%d%d", &x, &y);
printf("%lld\n", query(x, y, 1, n, 1));
}
else
{
scanf("%d%d%d", &x, &y, &z);
update(x, y, z, 1, n, 1);
}
}
}
return 0;
}