Combothermal

Untitled

Apr 21st, 2020
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. #pragma GCC optimize ("O3")
  2. #pragma GCC target ("sse4")
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9. typedef long double ld;
  10. typedef complex<ld> cd;
  11.  
  12. typedef pair<int, int> pi;
  13. typedef pair<ll,ll> pl;
  14. typedef pair<ld,ld> pd;
  15.  
  16. typedef vector<int> vi;
  17. typedef vector<ld> vd;
  18. typedef vector<ll> vl;
  19. typedef vector<pi> vpi;
  20. typedef vector<pl> vpl;
  21. typedef vector<cd> vcd;
  22.  
  23. #define FOR(i, a, b) for (int i=a; i<(b); i++)
  24. #define F0R(i, a) for (int i=0; i<(a); i++)
  25. #define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
  26. #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
  27.  
  28. #define sz(x) (int)(x).size()
  29. #define mp make_pair
  30. #define pb push_back
  31. #define f first
  32. #define s second
  33. #define lb lower_bound
  34. #define ub upper_bound
  35. #define all(x) x.begin(), x.end()
  36. #define ins insert
  37.  
  38. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  39.  
  40. const int MOD = 1000000007;
  41. const char nl = '\n';
  42. const int MX = 100001; //check the limits, dummy
  43.  
  44. const int L = 18;
  45. int anc[MX][L];
  46. int depth[MX];
  47. int parent[MX];
  48. ll subsize[MX];
  49. vector<vi> graph(MX);
  50. int N;
  51. ll val[MX];
  52.  
  53. int lca(int a, int b) {
  54. if (depth[a] < depth[b]) {
  55. int c = b;
  56. b = a;
  57. a = c;
  58. }
  59.  
  60. int dist = depth[a] - depth[b];
  61. while (dist > 0) {
  62. F0R(i, L) {
  63. if (dist & 1 << i) {
  64. a = anc[a][i];
  65. dist -= 1 << i;
  66. }
  67. }
  68. }
  69.  
  70. if (a == b) return a;
  71.  
  72. F0Rd(j, L) {
  73. if (anc[a][j] != -1 && anc[a][j] != anc[b][j]) {
  74. a = anc[a][j]; b = anc[b][j];
  75. }
  76. }
  77. return parent[a];
  78. }
  79.  
  80. int lift(int v, int d) {
  81. F0R(i, L) {
  82. if (d & (1 << i)) {
  83. v = anc[v][i];
  84. }
  85. }
  86. return v;
  87. }
  88.  
  89. int parDFS(int v, int p, int d) {
  90. parent[v] = p; depth[v] = d;
  91. ll S = val[v];
  92. F0R(i, sz(graph[v])) {
  93. int nxt = graph[v][i];
  94. if (nxt == p) continue;
  95. S += parDFS(nxt, v, d+1);
  96. }
  97. return subsize[v] = S;
  98. }
  99.  
  100. void preprocess() {
  101. parDFS(0, -1, 0);
  102. F0R(i, N) F0R(j, L) anc[i][j] = -1;
  103. F0R(i, N) anc[i][0] = parent[i];
  104. FOR(j, 1, L) {
  105. F0R(i, N) {
  106. if (anc[i][j-1] != -1) {
  107. anc[i][j] = anc[anc[i][j-1]][j-1];
  108. }
  109. }
  110. }
  111. }
  112.  
  113.  
  114. int main() {
  115. ios_base::sync_with_stdio(0); cin.tie(0);
  116.  
  117. cin >> N; int Q; cin >> Q;
  118. F0R(i, N) cin >> val[i];
  119. F0R(i, N-1) {
  120. int A, B; cin >> A >> B; A--; B--;
  121. graph[A].pb(B);
  122. graph[B].pb(A);
  123. }
  124.  
  125. preprocess();
  126.  
  127. while (Q--) {
  128. int A, B; cin >> A >> B; A--; B--;
  129. ll ans = subsize[0];
  130. if (lca(A, B) == A) { // B is in the subtree of A
  131. ans -= subsize[0] - subsize[lift(B, depth[B] - depth[A] - 1)];
  132. } else {
  133. ans -= subsize[A];
  134. }
  135.  
  136. if (lca(A, B) == B) {
  137. ans -= subsize[0] - subsize[lift(A, depth[A] - depth[B] - 1)];
  138. } else {
  139. ans -= subsize[B];
  140. }
  141. cout << ans << nl;
  142. }
  143.  
  144. return 0;
  145. }
  146.  
  147. // read the question correctly (ll vs int)
  148. // template by bqi343
Advertisement
Add Comment
Please, Sign In to add comment