fork download
  1. // ~~ icebear ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<int, ii> iii;
  8.  
  9. template<class T>
  10. bool minimize(T &a, const T &b) {
  11. if (a > b) return a = b, true;
  12. return false;
  13. }
  14.  
  15. template<class T>
  16. bool maximize(T &a, const T &b) {
  17. if (a < b) return a = b, true;
  18. return false;
  19. }
  20.  
  21. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  22. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  23. #define REP(i, n) for(int i=0; i<(n); ++i)
  24. #define RED(i, n) for(int i=(n)-1; i>=0; --i)
  25. #define MASK(i) (1LL << (i))
  26. #define BIT(S, i) (((S) >> (i)) & 1)
  27. #define mp make_pair
  28. #define pb push_back
  29. #define fi first
  30. #define se second
  31. #define all(x) x.begin(), x.end()
  32. #define task "gen"
  33.  
  34. const int MOD = 1e9 + 7;
  35. const int inf = 1e9 + 27092008;
  36. const ll INF = 1e18 + 27092008;
  37. const int N = 200000 + 5;
  38. const int S = 350;
  39. int n, m, q, a[N];
  40. vector<int> G[N];
  41. int pos[N], timer = 0, h[N], minHigh[N << 1][20], tour[N << 1];
  42.  
  43. void dfs(int u, int par) {
  44. pos[u] = ++timer;
  45. tour[timer] = u;
  46. for(int v : G[u]) if (v != par) {
  47. h[v] = h[u] + 1;
  48. dfs(v, u);
  49. tour[++timer] = u;
  50. }
  51. }
  52.  
  53. #define MIN_HIGH(x, y) (h[x] < h[y] ? x : y)
  54. int LCA(int u, int v) {
  55. int l = pos[u], r = pos[v];
  56. if (l > r) swap(l, r);
  57. int k = __lg(r - l + 1);
  58. return MIN_HIGH(minHigh[l][k], minHigh[r - MASK(k) + 1][k]);
  59. }
  60.  
  61. int dist(int u, int v) {
  62. int p = LCA(u, v);
  63. return h[u] + h[v] - 2 * h[p];
  64. }
  65.  
  66. ll lazy_add[N / S + 5]; // tất cả các thằng trong block đều cộng thêm lazy_add[B]
  67. int lazy_set[N / S + 5]; // giá trị hiện tại đang dc gán
  68. int first_set[N / S + 5]; // giá trị đầu tiên dc gán
  69. ll ans[N]; // kết quả của nhân viên i
  70. ll val[N / S + 5][N]; // giá trị hiện tại của giá trị u trong block B
  71. ll old[N]; // để ko phải reset mảng val, dùng mảng old để trừ đi những giá trị có sẵn trước khi add
  72.  
  73. void rebuild(int B) {
  74. if (lazy_set[B] == 0) return;
  75. FOR(i, B * S, (B + 1) * S - 1) {
  76. ans[i] += val[B][a[i]] - old[i] - dist(a[i], first_set[B]);
  77. a[i] = lazy_set[B];
  78. old[i] = val[B][a[i]];
  79. }
  80. first_set[B] = -1;
  81. lazy_set[B] = 0;
  82. }
  83.  
  84. void init(void) {
  85. cin >> n >> m >> q;
  86. REP(i, m) cin >> a[i];
  87. FOR(i, 2, n) {
  88. int u, v;
  89. cin >> u >> v;
  90. G[u].pb(v);
  91. G[v].pb(u);
  92. }
  93. }
  94.  
  95. void process(void) {
  96. dfs(1, -1);
  97. FOR(i, 1, timer) minHigh[i][0] = tour[i];
  98. FOR(j, 1, 19) FOR(i, 1, timer - MASK(j) + 1)
  99. minHigh[i][j] = MIN_HIGH(minHigh[i][j - 1], minHigh[i + MASK(j - 1)][j - 1]);
  100.  
  101. memset(first_set, -1, sizeof first_set);
  102. while(q--) {
  103. int type;
  104. cin >> type;
  105. if (type == 1) {
  106. int u, v;
  107. cin >> u >> v;
  108. FOR(B, 0, m / S)
  109. if (lazy_set[B] == u)
  110. lazy_add[B] += v;
  111. else if (lazy_set[B] == 0)
  112. val[B][u] += v;
  113. } else if (type == 2) {
  114. int l, r, z;
  115. cin >> l >> r >> z;
  116. l--; r--;
  117. if (l / S == r / S) {
  118. rebuild(l / S);
  119. FOR(i, l, r) {
  120. ans[i] += val[l / S][a[i]] - old[i] - dist(a[i], z);
  121. a[i] = z;
  122. old[i] = val[l / S][z];
  123. }
  124. continue;
  125. }
  126. rebuild(l / S);
  127. rebuild(r / S);
  128. FOR(i, l, (l / S + 1) * S - 1) {
  129. ans[i] += val[l / S][a[i]] - old[i] - dist(a[i], z);
  130. a[i] = z;
  131. old[i] = val[l / S][z];
  132. }
  133. FOR(i, (r / S) * S, r) {
  134. ans[i] += val[r / S][a[i]] - old[i] - dist(a[i], z);
  135. a[i] = z;
  136. old[i] = val[r / S][z];
  137. }
  138. FOR(i, l / S + 1, r / S - 1) {
  139. if (first_set[i] == -1)
  140. first_set[i] = z;
  141. if (lazy_set[i] > 0) lazy_add[i] -= dist(lazy_set[i], z);
  142. lazy_set[i] = z;
  143. }
  144. } else {
  145. int u; cin >> u;
  146. u--;
  147. rebuild(u / S);
  148. cout << ans[u] + lazy_add[u / S] + val[u / S][a[u]] - old[u] << '\n';
  149. }
  150. }
  151. }
  152.  
  153. signed main() {
  154. ios_base::sync_with_stdio(0);
  155. cin.tie(0); cout.tie(0);
  156. if (fopen(task".inp", "r")) {
  157. freopen(task".inp", "r", stdin);
  158. freopen(task".out", "w", stdout);
  159. }
  160. int tc = 1;
  161. // cin >> tc;
  162. while(tc--) {
  163. init();
  164. process();
  165. }
  166. return 0;
  167. }
  168.  
Success #stdin #stdout 0.01s 12248KB
stdin
Standard input is empty
stdout
Standard output is empty