Skip to content

Instantly share code, notes, and snippets.

@atupal
Created April 11, 2013 19:21
Show Gist options
  • Save atupal/5366407 to your computer and use it in GitHub Desktop.
Save atupal/5366407 to your computer and use it in GitHub Desktop.
/*
A. Greg and Array
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Greg has an array a = a1, a2, ..., an and m operations. Each operation looks as: li, ri, di, (1 ≤ li ≤ ri ≤ n). To apply operation i to the array means to increase all array elements with numbers li, li + 1, ..., ri by value di.
Greg wrote down k queries on a piece of paper. Each query has the following form: xi, yi, (1 ≤ xi ≤ yi ≤ m). That means that one should apply operations with numbers xi, xi + 1, ..., yi to the array.
Now Greg is wondering, what the array a will be after all the queries are executed. Help Greg.
Input
The first line contains integers n, m, k (1 ≤ n, m, k ≤ 105). The second line contains n integers: a1, a2, ..., an (0 ≤ ai ≤ 105) — the initial array.
Next m lines contain operations, the operation number i is written as three integers: li, ri, di, (1 ≤ li ≤ ri ≤ n), (0 ≤ di ≤ 105).
Next k lines contain the queries, the query number i is written as two integers: xi, yi, (1 ≤ xi ≤ yi ≤ m).
The numbers in the lines are separated by single spaces.
Output
On a single line print n integers a1, a2, ..., an — the array after executing all the queries. Separate the printed numbers by spaces.
Please, do not use the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams of the %I64d specifier.
Sample test(s)
input
3 3 3
1 2 3
1 2 1
1 3 2
2 3 4
1 2
1 3
2 3
output
9 18 17
input
1 1 1
1
1 1 1
1 1
output
2
input
4 3 6
1 2 3 4
1 2 1
2 3 2
3 4 4
1 2
1 3
2 3
1 2
1 3
2 3
output
5 18 31 20
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int MAX_N = int(1e5) + 10;
typedef long long int64;
int64 a[MAX_N], add[MAX_N];
int n, m, k;
int l[MAX_N], r[MAX_N], d[MAX_N];
int64 cnt[MAX_N] = { };
int main() {
cin >> n >> m >> k;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
for (int i = 0; i < m; ++i) {
cin >> l[i] >> r[i] >> d[i];
--l[i], --r[i];
}
for (int i = 0; i < k; ++i) {
int x, y;
scanf("%d%d", &x, &y);
--x, --y;
cnt[x]++;
cnt[y + 1]--;
}
for (int i = 0; i < m; ++i) {
cnt[i + 1] += cnt[i];
}
for (int i = 0; i < m; ++i) {
add[l[i]] += 1LL * d[i] * cnt[i];
add[r[i] + 1] -= 1LL * d[i] * cnt[i];
}
for (int i = 0; i < n; ++i) {
add[i + 1] += add[i];
}
for (int i = 0; i < n; ++i) {
cout << a[i] + add[i] << " ";
}
cout << endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment