Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. vector<vector<int> > g;
  5. vector<int> m, a, index, start, finish;
  6.  
  7.  
  8. int t[200000], z[200000];
  9.  
  10. void build(int v, int tl, int tr) {
  11. if (tl == tr) {
  12. t[v] = a[tl];
  13. } else {
  14. int tm = (tl + tr) / 2;
  15. build(v * 2, tl, tm);
  16. build(v * 2 + 1, tm + 1, tr);
  17. t[v] = t[v * 2] + t[v * 2 + 1];
  18. }
  19. }
  20.  
  21. void push(int v, int tl, int tr) {
  22. t[v] += (tr - tl + 1) * z[v];
  23. if (tl != tr) {
  24. z[v * 2] += z[v];
  25. z[v * 2 + 1] += z[v];
  26. }
  27. z[v] = 0;
  28. }
  29.  
  30. void update(int v, int tl, int tr, int l, int r, int val) {
  31. push(v, tl, tr);
  32. if (tl > r || tr < l)
  33. return;
  34. if (tl >= l && tr <= r) {
  35. z[v] = val;
  36. push(v, tl, tr);
  37. } else {
  38. int tm = (tl + tr) / 2;
  39. update(v, tl, tm, l, r, val);
  40. update(v, tm + 1, tr, l, r, val);
  41. t[v] = t[v * 2] + t[v * 2 + 1];
  42. }
  43. }
  44.  
  45.  
  46. int get_sum(int v, int tl, int tr, int l, int r) {
  47. push(v, tl, tr);
  48. if (tl > r || tr < l)
  49. return 0;
  50. if (tl >= l && tr <= r) {
  51. return t[v];
  52. } else {
  53. int tm = (tl + tr) / 2;
  54. return get_sum(v * 2, tl, tm, l, r) + get_sum(v * 2 + 1, tm + 1, tr, l, r);
  55. }
  56. }
  57.  
  58.  
  59.  
  60. void dfs1(int now) {
  61. start.push_back(now);
  62. for (int i = 0; i < g[now].size(); ++i) {
  63. int to = g[now][i];
  64. dfs1(to);
  65. }
  66. }
  67.  
  68. int dfs2(int now) {
  69. int anz = index[now];
  70. for (int i = 0; i < g[now].size(); ++i) {
  71. int to = g[now][i];
  72. int z = dfs2(to);
  73. anz = max(anz, z);
  74. }
  75. finish[now] = anz;
  76. return anz;
  77. }
  78.  
  79. int32_t main() {
  80. int n, q, s;
  81. cin >> n >> q >> s;
  82. g.resize(n);
  83. a.resize(n);
  84. m.resize(n);
  85. index.resize(n);
  86. finish.resize(n, -1);
  87. m[0] = s;
  88. for (int i = 1; i < n; ++i) {
  89. int t1, t2;
  90. cin >> t1 >> t2;
  91. g[t1].push_back(i);
  92. m[i] = t2;
  93. }
  94. dfs1(0);
  95. for (int i = 0; i < n; ++i) {
  96. index[start[i]] = i;
  97. }
  98. dfs2(0);
  99. /*for (int i = 0; i < n; ++i) {
  100. cout << start[i] << " ";
  101. }
  102. cout << endl;
  103. for (int i = 0; i < n; ++i) {
  104. cout << finish[i] << " ";
  105. }
  106. cout << endl;*/
  107. for (int i = 0; i < n; ++i) {
  108. a[i] = m[start[i]];
  109. }
  110. build(1, 0, n - 1);
  111. for (int i = 0; i < n; ++i) {
  112. cout << a[i] << " ";
  113. }
  114. cout << endl;
  115. cout << get_sum(1, 0, n - 1, 0, 0) << endl;
  116. for (int i = 0; i < q; ++i) {
  117. string str;
  118. int x, y, val;
  119. cin >> str >> x >> y >> val;
  120. if (str == "employee") {
  121. int ind = index[x];
  122. int value = get_sum(1, 0, n - 1, ind, ind);
  123. if (value < y) {
  124. update(1, 0, n - 1, ind, ind, val);
  125. }
  126. } else {
  127. int ind = index[x];
  128. int value = get_sum(1, 0, n - 1, ind, finish[x]);
  129. if (((long double)value) / (finish[x] - ind + 1) < y) {
  130. update(1, 0, n - 1, ind, finish[x], val);
  131. }
  132. }
  133. }
  134. for (int i = 0; i < n; ++i) {
  135. int ind = index[i];
  136. cout << get_sum(1, 0, n - 1, ind, ind) << endl;
  137. }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement