POJ 3468

来源:互联网 发布:js取json数组的值 编辑:程序博客网 时间:2024/06/05 14:27
#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);elsereturn 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;}