Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- vector<vector<int> > g;
- vector<int> m, a, index, start, finish;
- int t[200000], z[200000];
- void build(int v, int tl, int tr) {
- if (tl == tr) {
- t[v] = a[tl];
- } else {
- int tm = (tl + tr) / 2;
- build(v * 2, tl, tm);
- build(v * 2 + 1, tm + 1, tr);
- t[v] = t[v * 2] + t[v * 2 + 1];
- }
- }
- void push(int v, int tl, int tr) {
- t[v] += (tr - tl + 1) * z[v];
- if (tl != tr) {
- z[v * 2] += z[v];
- z[v * 2 + 1] += z[v];
- }
- z[v] = 0;
- }
- void update(int v, int tl, int tr, int l, int r, int val) {
- push(v, tl, tr);
- if (tl > r || tr < l)
- return;
- if (tl >= l && tr <= r) {
- z[v] = val;
- push(v, tl, tr);
- } else {
- int tm = (tl + tr) / 2;
- update(v, tl, tm, l, r, val);
- update(v, tm + 1, tr, l, r, val);
- t[v] = t[v * 2] + t[v * 2 + 1];
- }
- }
- int get_sum(int v, int tl, int tr, int l, int r) {
- push(v, tl, tr);
- if (tl > r || tr < l)
- return 0;
- if (tl >= l && tr <= r) {
- return t[v];
- } else {
- int tm = (tl + tr) / 2;
- return get_sum(v * 2, tl, tm, l, r) + get_sum(v * 2 + 1, tm + 1, tr, l, r);
- }
- }
- void dfs1(int now) {
- start.push_back(now);
- for (int i = 0; i < g[now].size(); ++i) {
- int to = g[now][i];
- dfs1(to);
- }
- }
- int dfs2(int now) {
- int anz = index[now];
- for (int i = 0; i < g[now].size(); ++i) {
- int to = g[now][i];
- int z = dfs2(to);
- anz = max(anz, z);
- }
- finish[now] = anz;
- return anz;
- }
- int32_t main() {
- int n, q, s;
- cin >> n >> q >> s;
- g.resize(n);
- a.resize(n);
- m.resize(n);
- index.resize(n);
- finish.resize(n, -1);
- m[0] = s;
- for (int i = 1; i < n; ++i) {
- int t1, t2;
- cin >> t1 >> t2;
- g[t1].push_back(i);
- m[i] = t2;
- }
- dfs1(0);
- for (int i = 0; i < n; ++i) {
- index[start[i]] = i;
- }
- dfs2(0);
- /*for (int i = 0; i < n; ++i) {
- cout << start[i] << " ";
- }
- cout << endl;
- for (int i = 0; i < n; ++i) {
- cout << finish[i] << " ";
- }
- cout << endl;*/
- for (int i = 0; i < n; ++i) {
- a[i] = m[start[i]];
- }
- build(1, 0, n - 1);
- for (int i = 0; i < n; ++i) {
- cout << a[i] << " ";
- }
- cout << endl;
- cout << get_sum(1, 0, n - 1, 0, 0) << endl;
- for (int i = 0; i < q; ++i) {
- string str;
- int x, y, val;
- cin >> str >> x >> y >> val;
- if (str == "employee") {
- int ind = index[x];
- int value = get_sum(1, 0, n - 1, ind, ind);
- if (value < y) {
- update(1, 0, n - 1, ind, ind, val);
- }
- } else {
- int ind = index[x];
- int value = get_sum(1, 0, n - 1, ind, finish[x]);
- if (((long double)value) / (finish[x] - ind + 1) < y) {
- update(1, 0, n - 1, ind, finish[x], val);
- }
- }
- }
- for (int i = 0; i < n; ++i) {
- int ind = index[i];
- cout << get_sum(1, 0, n - 1, ind, ind) << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement