Neka je dat niz celih brojeva \(\mathbf{a}\) veličine \(n\). Dalje, neka je dato \(m\) operacija oblika \(l\ r\ d\), koje uvećavaju elemenate, koji se nalaze na pozicijama između \(l\) i \(r\), niza \(\mathbf{a}\) za vrednost \(d\). Drugim rečima, ukoliko primenimo uopraciju \(l\ r\ d\), onda niz \(\mathbf{a}\) postaje oblika \(\mathbf{a}_0, \mathbf{a}_1, \ldots, \mathbf{a}_{l - 1}, \mathbf{a}_l + d, \ldots, \mathbf{a}_r + d, \mathbf{a}_{r + 1}, \ldots, \mathbf{a}_r\). Na kraju, neka je dato \(k\) upita oblika \(x\), gde svaki upit predstavlja primenu operacije \(l_x\ r_x\ d_x\).
Odrediti konačno stanje niza.
Sa standardnog ulaza se, redom, unose vrednost \(n, m, k\) (\(1 \leq n, m, k \leq 10^5\)). U sledećoj liniji, se unosi \(n\) elemenata niza \(\mathbf{a}\) (\(1 \leq \mathbf{a}_i \leq 100\)). U sledećih \(m\) linija, se unose operacije oblike \(l_j\ r_j\ d_j\) (\(0 \leq l_j \leq r_j < n, 0 < d < 10, 0 < j \leq m\)), svaka u zasebnoj liniji. U sledećih \(k\) linija, se unose upiti oblika \(x_i\) (\(0 \leq x_i < m\)), svaki u zasebnoj liniji.
Na standardni izlaz ispisati izmenjeno stanje niza \(\mathbf{a}\).
3 3 5 1 2 3 0 1 1 0 2 2 1 2 4 0 1 0 2 1
7 12 11
1 1 1 1 0 0 1 0
2
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
#include <tuple>
#include <vector>
using namespace std;
int main()
{
int n, m, k; cin >> n >> m >> k;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
vector<tuple<int, int, int>> op(m);
for (int i = 0; i < m; i++) {
int l, r, d; cin >> l >> r >> d;
op[i] = { l, r, d };
}
vector<int> count(m);
for (int i = 0; i < k; i++) {
int x; cin >> x;
count[x]++;
}
vector<int> to_add(n + 1, 0);
for (int i = 0; i < m; i++) {
const auto &[l, r, d] = op[i];
to_add[l] += count[i] * d;
to_add[r + 1] -= count[i] * d;
}
for (int i = 1; i <= n; i++) {
to_add[i] += to_add[i - 1];
}
for (int i = 0; i < n; i++) {
cout << arr[i] + to_add[i] << " ";
}
cout << endl;
return 0;
}#include <iostream>
#include <tuple>
#include <vector>
using namespace std;
int main()
{
int n, m, k; cin >> n >> m >> k;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
vector<tuple<int, int, int>> op(m);
for (int i = 0; i < m; i++) {
int l, r, d; cin >> l >> r >> d;
op[i] = { l, r, d };
}
while(k--) {
int x; cin >> x;
const auto &[l, r, d] = op[x];
for (int i = l; i <= r; i++) {
arr[i] += d;
}
}
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}