Combothermal

farmernjoh

Apr 21st, 2020
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 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. int subsize[MX];
  49. vector<vi> graph(MX);
  50. int N;
  51.  
  52. int lca(int a, int b) {
  53. if (depth[a] < depth[b]) {
  54. int c = b;
  55. b = a;
  56. a = c;
  57. }
  58.  
  59. int dist = depth[a] - depth[b];
  60. while (dist > 0) {
  61. F0R(i, L) {
  62. if (dist & 1 << i) {
  63. a = anc[a][i];
  64. dist -= 1 << i;
  65. }
  66. }
  67. }
  68.  
  69. if (a == b) return a;
  70.  
  71. F0Rd(j, L) {
  72. if (anc[a][j] != -1 && anc[a][j] != anc[b][j]) {
  73. a = anc[a][j]; b = anc[b][j];
  74. }
  75. }
  76. return parent[a];
  77. }
  78.  
  79. int lift(int v, int d) {
  80. F0R(i, L) {
  81. if (d & (1 << i)) {
  82. v = anc[v][i];
  83. }
  84. }
  85. return v;
  86. }
  87.  
  88. int parDFS(int v, int p, int d) {
  89. parent[v] = p; depth[v] = d;
  90. int S = 1;
  91. F0R(i, sz(graph[v])) {
  92. int nxt = graph[v][i];
  93. if (nxt == p) continue;
  94. S += parDFS(nxt, v, d+1);
  95. }
  96. return subsize[v] = S;
  97. }
  98.  
  99. void preprocess() {
  100. parDFS(0, -1, 0);
  101. F0R(i, N) F0R(j, L) anc[i][j] = -1;
  102. F0R(i, N) anc[i][0] = parent[i];
  103. FOR(j, 1, L) {
  104. F0R(i, N) {
  105. if (anc[i][j-1] != -1) {
  106. anc[i][j] = anc[anc[i][j-1]][j-1];
  107. }
  108. }
  109. }
  110. }
  111.  
  112.  
  113. int main() {
  114. ios_base::sync_with_stdio(0); cin.tie(0);
  115.  
  116. cin >> N; int Q; cin >> Q;
  117. F0R(i, N-1) {
  118. int A, B; cin >> A >> B; A--; B--;
  119. graph[A].pb(B);
  120. graph[B].pb(A);
  121. }
  122.  
  123. preprocess();
  124.  
  125. while (Q--) {
  126. int A, B; cin >> A >> B; A--; B--;
  127. int ans = N-2;
  128. if (lca(A, B) == A) { // B is in the subtree of A
  129. ans -= N - subsize[lift(B, depth[B] - depth[A] - 1)] - 1;
  130. } else {
  131. ans -= subsize[A] - 1;
  132. }
  133.  
  134. if (lca(A, B) == B) {
  135. ans -= N - subsize[lift(A, depth[A] - depth[B] - 1)] - 1;
  136. } else {
  137. ans -= subsize[B] - 1;
  138. }
  139. cout << ans << nl;
  140. }
  141.  
  142. return 0;
  143. }
  144.  
  145. // read the question correctly (ll vs int)
  146. // template by bqi343
Advertisement
Add Comment
Please, Sign In to add comment