Description
You have N integers, A1, A2, ... ,
AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1,
A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C abc" means adding c to each of Aa, Aa+1, ... ,
Ab. -10000 ≤ c ≤ 10000.
"Q ab" means querying the sum of Aa, Aa+1, ... ,
Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4
Sample Output
4 55 9 15
Hint
The sums may exceed the range of 32-bit integers.
题意:区间修改,区间求和
思路:典型的线段树区间求和
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define lson(x) ((x) << 1) #define rson(x) ((x) << 1 | 1) #define ll long long using namespace std; const int maxn = 100005; struct seg { ll w; int flag; }; struct segment_tree { seg node[maxn<<2]; void update(int pos) { node[pos].w = node[lson(pos)].w + node[rson(pos)].w; } void build(int l, int r, int pos) { node[pos].flag = 0; if (l == r) { scanf("%lld", &node[pos].w); return; } int m = l + r >> 1; build(l, m, lson(pos)); build(m+1, r, rson(pos)); update(pos); } void push(int l, int r, int pos) { int len = r - l + 1; if (node[pos].flag != 0) { node[lson(pos)].flag += node[pos].flag; node[rson(pos)].flag += node[pos].flag; node[lson(pos)].w += (ll)node[pos].flag * (len - (len >> 1)); node[rson(pos)].w += (ll)node[pos].flag * (len >> 1); node[pos].flag = 0; } } void modify(int l, int r, int pos, int x, int y, int z) { if (x <= l && y >= r) { node[pos].w += (ll)(r-l+1) * z; node[pos].flag += z; return; } push(l, r, pos); int m = l + r >> 1; if (x <= m) modify(l, m, lson(pos), x, y, z); if (y > m) modify(m+1, r, rson(pos), x, y, z); update(pos); } ll query(int l, int r, int pos, int x, int y) { if (x <= l && y >= r) return node[pos].w; push(l, r, pos); int m = l + r >> 1; ll res = 0; if (x <= m) res += query(l, m, lson(pos), x, y); if (y > m) res += query(m+1, r, rson(pos), x, y); return res; } } tree; int main() { int n, q, a, b, c; char str[10]; while (scanf("%d%d", &n, &q) != EOF) { tree.build(1, n, 1); for (int i = 0; i < q; i++) { scanf("%s", str); if (str[0] == 'Q') { scanf("%d%d", &a, &b); printf("%lld\n",tree.query(1, n, 1, a, b)); } else if (str[0] == 'C'){ scanf("%d%d%d", &a, &b, &c); tree.modify(1, n, 1, a, b, c); } } } return 0; }
POJ - 3468 A Simple Problem with Integers (区间求和)