#include <iostream>
using namespace std;
#define L(x) ((x) << 1)
#define R(x) (((x) << 1) | 1)
#define MAXN 100010
//const int MAXN = 100010;
struct node
{
int l;
int r;
__int64 sum;
__int64 inc;
}nodes[MAXN * 6];
void build(int l, int r, int pos)
{
nodes[pos].l = l;
nodes[pos].r = r;
nodes[pos].sum = 0;
nodes[pos].inc = 0;
if(l == r)
return;
int mid = (l + r) / 2;
build(l, mid, pos << 1);
build(mid + 1, r, (pos << 1) | 1);
};
__int64 insert(int l, int r, int pos, __int64 v)
{
if(nodes[pos].l == l && nodes[pos].r == r)
{
nodes[pos].inc += v;
nodes[pos].sum += v * (r - l + 1);
return v * (r - l + 1);
}
__int64 sum;
int mid = (nodes[pos].l + nodes[pos].r) / 2;
if(r <= mid)
sum = insert(l, r, pos << 1, v);
else if(l > mid)
sum = insert(l, r, (pos << 1) | 1, v);
else
{
sum = insert(l, mid, pos << 1, v) + insert(mid + 1, r, (pos << 1) | 1, v);
}
nodes[pos].sum += sum;
return sum;
};
__int64 inc;
__int64 query(int l, int r, int pos)
{
if(inc = nodes[pos].inc)
{
nodes[L(pos)].inc += inc;
nodes[L(pos)].sum += inc * (nodes[L(pos)].r - nodes[L(pos)].l + 1);
nodes[R(pos)].inc += inc;
nodes[R(pos)].sum += inc * (nodes[R(pos)].r - nodes[R(pos)].l + 1);
nodes[pos].inc = 0;
}
if(nodes[pos].l == l && nodes[pos].r == r)
{
return nodes[pos].sum;
}
int mid = (nodes[pos].l + nodes[pos].r) / 2;
if(r <= mid)
return query(l, r, pos << 1);
else if(l > mid)
return query(l, r, (pos << 1) | 1);
else
return query(l, mid, pos << 1) + query(mid + 1, r, (pos << 1) | 1);
};
int main()
{
int N, Q;
scanf("%d%d", &N, &Q);
build(1, N, 1);
int k;
for(int i = 1; i <= N; ++i)
{
scanf("%d", &k);
insert(i, i, 1, k);
}
char sign;
int x, y;
int v;
__int64 res;
while(Q--)
{
getchar();
scanf("%c", &sign);
scanf("%d%d", &x, &y);
if(sign == 'Q')
{
res = query(x, y, 1);
printf("%I64d\n", res);
}
else
{
scanf("%d", &v);
insert(x, y, 1, v);
}
}
return 0;
}POJ 3468
最新推荐文章于 2016-10-23 21:48:23 发布
176

被折叠的 条评论
为什么被折叠?



