Advertisement
Galebickosikasa

Untitled

Dec 20th, 2020
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21. #include <cassert>
  22.  
  23. #define fi first
  24. #define se second
  25. #define pb push_back
  26. #define ll long long
  27. #define ld long double
  28. #define hm unordered_map
  29. #define pii pair<int, int>
  30. #define sz(a) (int)a.size()
  31. #define all(a) a.begin(), a.end()
  32. #define cinv(v) for (auto& x: v) cin >> x
  33. #define fr(i, n) for (int i = 0; i < n; ++i)
  34. #define fl(i, l, n) for (int i = l; i < n; ++i)
  35.  
  36. #define int ll
  37.  
  38. template <typename T1, typename T2> inline bool chkmin(T1 &x, const T2 &y) {if (x > y) {x = y; return 1;} return 0;}
  39. template <typename T1, typename T2> inline bool chkmax(T1 &x, const T2 &y) {if (x < y) {x = y; return 1;} return 0;}
  40.  
  41. using namespace std;
  42.  
  43. #ifdef LOCAL
  44. #define dbg(x) cerr << #x << " : " << x << '\n'
  45. const int maxn = 1000 + 20;
  46. #else
  47. #define dbg(x)
  48. const int maxn = 2e5 + 20;
  49. #endif
  50.  
  51. //tg: @galebickosikasa
  52.  
  53. ostream& operator << (ostream& out, const pii& v) {
  54. out << v.fi << ", " << v.se;
  55. return out;
  56. }
  57.  
  58. template<typename T> ostream& operator << (ostream& out, const vector<T>& v) {
  59. for (auto& x: v) out << x << " ";
  60. return out;
  61. }
  62.  
  63. istream& operator >> (istream& in, pii& a) {
  64. in >> a.fi >> a.se;
  65. return in;
  66. }
  67.  
  68. const ll inf = (ll) 2e9;
  69. const ld pi = asin (1) * 2;
  70. const ld eps = 1e-8;
  71. const ll mod = (ll)1e9 + 7;
  72. const ll ns = 97;
  73. const int maxlog = 17;
  74.  
  75. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  76.  
  77. vector<int> g[maxn], order;
  78. int par[maxn], sz[maxn], dp[maxn], bin[maxn][maxlog], pos[maxn];
  79. int deep[maxn];
  80.  
  81. void dfs (int v, int p = -1) {
  82. if (p != -1) deep[v] = deep[p] + 1;
  83. par[v] = p;
  84. order.pb (v);
  85. sz[v] = 1;
  86. if (p == -1) bin[v][0] = v;
  87. else bin[v][0] = p;
  88. fl (i, 1, maxlog) bin[v][i] = bin[bin[v][i - 1]][i - 1];
  89. for (auto& u: g[v]) {
  90. if (u != p) {
  91. dfs (u, v);
  92. sz[v] += sz[u];
  93. }
  94. }
  95. }
  96.  
  97. void dfs1 (int v, int p = -1) {
  98. if (p != -1) dp[v] += dp[p];
  99. // if (v < p) dp[v] -= sz[v];
  100. ++dp[v];
  101. for (auto& u: g[v]) {
  102. if (u < p) {
  103. dp[v] += sz[u];
  104. }
  105. }
  106. for (auto& u: g[v]) {
  107. if (u != p) dfs1 (u, v);
  108. }
  109. dbg (v + 1);
  110. dbg (dp[v]);
  111. }
  112.  
  113. int la (int v, int k) {
  114. for (int i = maxlog - 1; i >= 0; --i) {
  115. if (k >= (1<<i)) {
  116. v = bin[v][i];
  117. k -= (1<<i);
  118. }
  119. }
  120. return v;
  121. }
  122.  
  123. signed main () {
  124. ios_base::sync_with_stdio(false);
  125. cin.tie(nullptr);
  126. cout.tie(nullptr);
  127. for (auto& x: par) x = inf;
  128. int n, q;
  129. cin >> n >> q;
  130. fr (i, n - 1) {
  131. int a, b;
  132. cin >> a >> b;
  133. --a, --b;
  134. g[a].pb (b), g[b].pb (a);
  135. }
  136. for (auto& v: g) sort (all (v));
  137. dfs (0);
  138. fr (i, sz (order)) pos[order[i]] = i;
  139. dfs1 (0);
  140. fr (i, q) {
  141. int k;
  142. cin >> k;
  143. int v = (k - 1) / n;
  144. dbg (v + 1);
  145. k -= v * n;
  146. dbg (k);
  147.  
  148. int l = -1, r = deep[v] + 2;
  149. // int l = 0;
  150. // int u = v;
  151. // int prev = -1;
  152. // for (; l < n; ++l) {
  153. // if (dp[v] - dp[u] + 1 <= k && dp[v] - dp[u] + 1 + n - sz[u] > k) {
  154. // prev = u;
  155. // u = par[u];
  156. // continue;
  157. // }
  158. // }
  159.  
  160. while (r - l > 1) {
  161. int mid = (r + l) / 2;
  162. int t = la (v, mid);
  163. dbg (mid);
  164. dbg (t + 1);
  165. if (dp[v] - dp[t] + 1 < k && dp[v] - dp[t] + 1 + n - sz[t] >= k) l = mid;
  166. else r = mid;
  167. }
  168. dbg (l);
  169. dbg (r);
  170.  
  171. int u = la (v, l + 1);
  172. dbg (u + 1);
  173.  
  174. int pr = -1;
  175. if (l >= 0) pr = la (v, l);
  176. dbg (pr + 1);
  177. dbg (k);
  178. dbg (dp[v] - dp[u] + 1);
  179. dbg (dp[v] - dp[u] + 1 + n - sz[u]);
  180. if (dp[v] - dp[u] + 1 + n - sz[u] < k) k -= dp[v] - dp[u] + 1 + n - sz[u];
  181. else k -= dp[v] - dp[u] + 1;
  182. dbg (k);
  183. int need = pos[u] + k;
  184. if (pr != -1 && need >= pos[pr]) need = pos[u] + k + sz[pr];
  185. // if (need >= sz (order)) exit (0);
  186. cout << v + 1 << ' ' << order[need] + 1 << '\n';
  187. }
  188.  
  189.  
  190.  
  191.  
  192.  
  193. }
  194.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement