Advertisement
Guest User

Some sqrt

a guest
Jan 21st, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. //http://codeforces.com/contest/342/problem/E
  2.  
  3. #include <stdio.h>
  4. #include <bits/stdc++.h>
  5.  
  6. #define pb push_back
  7. #define pp pop_back
  8. #define sz(a) (int)(a.size())
  9. #define mp make_pair
  10. #define F first
  11. #define S second
  12. #define next _next
  13. #define prev _prev
  14. #define left _left
  15. #define right _right
  16. #define y1 _y1
  17. #define all(x) x.begin(), x.end()
  18.  
  19. using namespace std;
  20.  
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. typedef long double ld;
  24. typedef pair<int, int> pii;
  25. typedef pair<ll, ll> pll;
  26.  
  27. const int N = (int)1e5 + 123;
  28. const ll INF = (ll)1e18 + 123;
  29. const int inf = (int)1e9 + 123;
  30. const int MOD = (int)1e9 + 7;
  31.  
  32. int n, m;
  33. vector<int> tmp, g[N];
  34. int d[25][N], tin[N], tout[N], timer, mn[N], h[N];
  35. bool red[N];
  36.  
  37. void dfs(int x, int par = 0) {
  38. if(par) h[x] = h[par] + 1;
  39. d[0][x] = par;
  40. for(int i = 1; i <= 20; i ++)
  41. d[i][x] = d[i - 1][d[i - 1][x]];
  42. tin[x] = ++ timer;
  43. for(auto to : g[x]) {
  44. if(to == par) continue;
  45. dfs(to, x);
  46. }
  47. tout[x] = ++ timer;
  48. }
  49.  
  50. inline bool is_par(int a, int b) {
  51. return (tin[a] <= tin[b] && tout[a] >= tout[b]);
  52. }
  53.  
  54. inline int get_lca(int a, int b) {
  55. if(is_par(a, b)) return a;
  56. if(is_par(b, a)) return b;
  57. int v = a;
  58. for(int i = 20; i >= 0; i --)
  59. if(d[i][v] && !is_par(d[i][v], b))
  60. v = d[i][v];
  61. return d[0][v];
  62. }
  63.  
  64. int dist(int a, int b) {
  65. return h[a] + h[b] - 2 * h[get_lca(a, b)];
  66. }
  67.  
  68. void jfs(int x, int par = 0) {
  69. if(red[x]) mn[x] = 0;
  70. for(auto to : g[x]) {
  71. if(to == par) continue;
  72. jfs(to, x);
  73. mn[x] = min(mn[x], mn[to] + 1);
  74. }
  75. }
  76.  
  77. void gfs(int x, int par = 0) {
  78. if(red[x]) mn[x] = 0;
  79. mn[x] = min(mn[x], mn[par] + 1);
  80. for(auto to : g[x]) {
  81. if(to == par) continue;
  82. gfs(to, x);
  83. }
  84. }
  85.  
  86. int main() {
  87. unsigned int FOR;
  88. asm("rdtsc" : "=A"(FOR));
  89. srand(FOR);
  90. scanf("%d%d", &n, &m);
  91. for(int i = 1, x, y; i < n; i ++) {
  92. scanf("%d%d", &x, &y);
  93. g[x].pb(y), g[y].pb(x);
  94. }
  95. for(int i = 1; i <= n; i ++)
  96. mn[i] = inf;
  97. red[1] = 1;
  98. dfs(1), jfs(1), gfs(1);
  99. int sqrt_m = sqrt(m);
  100. if(sqrt_m * sqrt_m < m) sqrt_m ++;
  101. for(int i = 1, type, x; i <= m; i ++) {
  102. scanf("%d%d", &type, &x);
  103. if(type == 1) {
  104. tmp.pb(x), red[x] = 1;
  105. } else {
  106. int res = mn[x];
  107. for(auto j : tmp) res = min(res, dist(x, j));
  108. printf("%d\n", res);
  109. }
  110. if(sz(tmp) == sqrt_m)
  111. tmp.clear(), jfs(1), gfs(1);
  112. }
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement