Advertisement
GerONSo

Untitled

Mar 25th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.26 KB | None | 0 0
  1. // #define pragma
  2.  
  3. #ifdef pragma
  4. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
  5. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  6. #endif // pragma
  7.  
  8. #include<bits/stdc++.h>
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11.  
  12. #define ll long long
  13. #define all(x) begin(x), end(x)
  14. #define pb push_back
  15. #define x first
  16. #define y second
  17. #define int long long
  18. #define zero(two) memset(two, 0, sizeof(two))
  19.  
  20. using namespace std;
  21. using namespace __gnu_pbds;
  22.  
  23.  
  24. typedef vector<int> vi;
  25. typedef vector<bool> vb;
  26. typedef pair<int, int> pii;
  27. typedef long double ld;
  28. typedef vector<vi> matrix;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. // cout << fixed << setprecision(10);
  39. #if _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 1e6 + 10;
  46. const int INF = 1e15 + 7;
  47. const int MAXLOG = 31;
  48. const int MOD = 1e9 + 7;
  49. const int BASE = 47;
  50.  
  51. matrix g;
  52. vi odd, even, tin, tout, codd, ceven, a, isEven;
  53. vector<pii> todd, teven;
  54. int tt = 0;
  55. int n, q;
  56.  
  57. void dfs(int u, int p, int dep) {
  58. if(dep % 2) {
  59. isEven[u] = 1;
  60. even.pb(u);
  61. }
  62. else {
  63. odd.pb(u);
  64. }
  65. tin[u] = tt++;
  66. for(auto v : g[u]) {
  67. if(v != p) {
  68. dfs(v, u, dep + 1);
  69. }
  70. }
  71. tout[u] = tt++;
  72. }
  73.  
  74. void push_even(int v, int l, int r) {
  75. teven[v].x += teven[v].y * (r - l + 1);
  76. teven[v * 2 + 1].y += teven[v].y;
  77. teven[v * 2 + 2].y += teven[v].y;
  78. teven[v].y = 0;
  79. }
  80.  
  81. int get_even(int v, int tl, int tr, int l, int r) {
  82. push_even(v, tl, tr);
  83. if(tl > r || tr < l) {
  84. return 0;
  85. }
  86. if(tl >= l && tr <= r) {
  87. return teven[v].x;
  88. }
  89. int tm = (tl + tr) >> 1;
  90. int left = get_even(v * 2 + 1, tl, tm, l, r);
  91. int right = get_even(v * 2 + 2, tm + 1, tr, l, r);
  92. return left + right;
  93. }
  94.  
  95. void update_even(int v, int tl, int tr, int l, int r, int val) {
  96. // cerr << tl << " " << tr << '\n';
  97. push_even(v, tl, tr);
  98. if(tl > r || tr < l) {
  99. return;
  100. }
  101. if(tl >= l && tr <= r) {
  102. // cerr << tl << " " << tr << " " << val << '\n';
  103. teven[v].y += val;
  104. push_even(v, tl, tr);
  105. return;
  106. }
  107. int tm = (tl + tr) >> 1;
  108. update_even(v * 2 + 1, tl, tm, l, r, val);
  109. update_even(v * 2 + 2, tm + 1, tr, l, r, val);
  110. teven[v].x = teven[v * 2 + 1].x + teven[v * 2 + 2].x;
  111. }
  112.  
  113.  
  114.  
  115. void push_odd(int v, int l, int r) {
  116. todd[v].x += todd[v].y * (r - l + 1);
  117. todd[v * 2 + 1].y += todd[v].y;
  118. todd[v * 2 + 2].y += todd[v].y;
  119. todd[v].y = 0;
  120. }
  121.  
  122. int get_odd(int v, int tl, int tr, int l, int r) {
  123. push_odd(v, tl, tr);
  124. if(tl > r || tr < l) {
  125. return 0;
  126. }
  127. if(tl >= l && tr <= r) {
  128. return todd[v].x;
  129. }
  130. int tm = (tl + tr) >> 1;
  131. int left = get_odd(v * 2 + 1, tl, tm, l, r);
  132. int right = get_odd(v * 2 + 2, tm + 1, tr, l, r);
  133. return left + right;
  134. }
  135.  
  136. void update_odd(int v, int tl, int tr, int l, int r, int val) {
  137. push_odd(v, tl, tr);
  138. if(tl > r || tr < l) {
  139. return;
  140. }
  141. if(tl >= l && tr <= r) {
  142. todd[v].y += val;
  143. push_odd(v, tl, tr);
  144. return;
  145. }
  146. int tm = (tl + tr) >> 1;
  147. update_odd(v * 2 + 1, tl, tm, l, r, val);
  148. update_odd(v * 2 + 2, tm + 1, tr, l, r, val);
  149. todd[v].x = todd[v * 2 + 1].x + todd[v * 2 + 2].x;
  150. }
  151.  
  152. signed main() {
  153. seriy();
  154. cin >> n >> q;
  155. isEven.resize(n);
  156. todd.resize(8 * n);
  157. teven.resize(8 * n);
  158. tin.resize(n);
  159. tout.resize(n);
  160. g.resize(n);
  161. a.resize(n);
  162. for(int i = 0; i < n; i++) {
  163. cin >> a[i];
  164. }
  165. for(int i = 0; i < n - 1; i++) {
  166. int u, v;
  167. cin >> u >> v;
  168. u--;
  169. v--;
  170. g[u].pb(v);
  171. g[v].pb(u);
  172. }
  173. dfs(0, -1, 0);
  174. vi wer(n);
  175. for(int i = 0; i < odd.size(); i++) {
  176. wer[odd[i]] = i;
  177. codd.pb(tin[odd[i]]);
  178. }
  179. for(int i = 0; i < even.size(); i++) {
  180. wer[even[i]] = i;
  181. ceven.pb(tin[even[i]]);
  182. }
  183. // sort(all(codd));
  184. // sort(all(ceven));
  185. for(int i = 0; i < even.size(); i++) {
  186. update_even(0, 0, n - 1, i, i, a[even[i]]);
  187. }
  188. for(int i = 0; i < odd.size(); i++) {
  189. update_odd(0, 0, n - 1, i, i, a[odd[i]]);
  190. }
  191. while(q--) {
  192. int t;
  193. cin >> t;
  194. if(t == 1) {
  195. int x, val;
  196. cin >> x >> val;
  197. x--;
  198. if(isEven[x]) {
  199. int left = lower_bound(all(ceven), tin[x]) - ceven.begin();
  200. int right = lower_bound(all(ceven), tout[x]) - ceven.begin() - 1;
  201. // assert(left <= right);
  202. update_even(0, 0, n - 1, left, right, val);
  203. left = lower_bound(all(codd), tin[x]) - codd.begin();
  204. right = lower_bound(all(codd), tout[x]) - codd.begin() - 1;
  205. // assert(left <= right);
  206. if(left != codd.size()) update_odd(0, 0, n - 1, left, right, -val);
  207. }
  208. else {
  209. int left = lower_bound(all(ceven), tin[x]) - ceven.begin();
  210. int right = lower_bound(all(ceven), tout[x]) - ceven.begin() - 1;
  211. // assert(left <= right);
  212. // cerr << left << " " << right << " " << -val << '\n';
  213. if(left != ceven.size()) update_even(0, 0, n - 1, left, right, -val);
  214. left = lower_bound(all(codd), tin[x]) - codd.begin();
  215. right = lower_bound(all(codd), tout[x]) - codd.begin() - 1;
  216. // assert(left <= right);
  217. update_odd(0, 0, n - 1, left, right, val);
  218. }
  219. }
  220. else {
  221. int x;
  222. cin >> x;
  223. x--;
  224. if(isEven[x]) {
  225. int pos = wer[x];
  226. cout << get_even(0, 0, n - 1, pos, pos) << '\n';
  227. }
  228. else {
  229. int pos = wer[x];
  230. cout << get_odd(0, 0, n - 1, pos, pos) << '\n';
  231. }
  232. }
  233. }
  234. return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement