Language:DefaultA Simple Problem with Integers
| Time Limit:5000 MS |
|
Memory Limit:131072 K |
| Total Submissions:62629 |
|
Accepted:19215 |
| Case Time Limit:2000 MS |
Description You haveNIntegers,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 numbersNAndQ. 1 ≤N,Q≤ 100000. The second line containsNNumbers, the initial valuesA1,A2 ,...,AN.-1000000000 ≤Ai≤ 1000000000. Each of the nextQLines represents an operation. "CA B c"Means addingCTo eachAa,Aa+ 1 ,...,AB.-10000 ≤C≤ 10000. "QA B"Means querying the sumAa,Aa+ 1 ,...,AB. Output You need to answer allQCommands in order. One answer in a line. Sample Input 10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4 Sample Output 455915 Hint The sums may exceed the range of 32-bit integers.Source POJ Monthly -- 2007.11.25, Yang Yi code:# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Define eps 1e-9 # define ll long # define INF 0x3f3f3fusing namespace std; const int maxn = 100000 + 10; ll col [maxn * 4]; ll tree [maxn * 4]; int n, m; void push_up (int dex) {tree [dex] = tree [dex <1] + tree [dex <1 | 1];} void push_down (int cnt, int dex) {if (col [dex]) {col [dex <1] + = col [dex]; // here we need to accumulate col [dex <1 | 1] + = col [dex]; tree [dex <1] + = (cnt-(cnt> 1) * col [dex]; tree [dex <1 | 1] + = (cnt> 1) * col [dex]; col [dex] = 0 ;}} void Buildtree (int l, int r, int dex) {col [dex] = 0; if (l = r) {scanf ("% I64d ", & tree [dex]); return;} int mid = (l + r)/2; buildtree (l, mid, dex <1); buildtree (mid + 1, r, dex <1 | 1); push_up (dex);} void update (int L, int R, int l, int r, int dex, long val) {if (L <= l & R> = r) {tree [dex] + = (r-l + 1) * val; col [dex] + = val; return;} push_down (r-l + 1, dex); int mid = (l + r)/2; if (L <= mid) update (L, R, l, mid, dex <1, val); if (R> mid) update (L, R, mid + 1, r, dex <1 | 1, val); push_up (dex);} long Query (int L, int R, int l, int r, int dex) {if (L <= l & R> = r) return tree [dex]; push_down (r-l + 1, dex ); int mid = (l + r)/2; if (R <= mid) return Query (L, R, l, mid, dex <1 ); else if (L> mid) return Query (L, R, mid + 1, r, dex <1 | 1); else return Query (L, R, l, mid, dex <1) + Query (L, R, mid + 1, r, dex <1 | 1);} int main () {char str [2]; int u, v; long w; while (~ Scanf ("% d", & n, & m) {buildtree (1, n, 1); while (m --) {scanf ("% s ", str); if (str [0] = 'q') {scanf ("% d", & u, & v ); printf ("% I64d \ n", Query (u, v, 1, n, 1);} else {scanf ("% d % I64d", & u, & v, & w); update (u, v, 1, n, 1, w) ;}} return 0 ;}
|