Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //http://codeforces.com/contest/342/problem/E
- #include <stdio.h>
- #include <bits/stdc++.h>
- #define pb push_back
- #define pp pop_back
- #define sz(a) (int)(a.size())
- #define mp make_pair
- #define F first
- #define S second
- #define next _next
- #define prev _prev
- #define left _left
- #define right _right
- #define y1 _y1
- #define all(x) x.begin(), x.end()
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- const int N = (int)1e5 + 123;
- const ll INF = (ll)1e18 + 123;
- const int inf = (int)1e9 + 123;
- const int MOD = (int)1e9 + 7;
- int n, m;
- vector<int> tmp, g[N];
- int d[25][N], tin[N], tout[N], timer, mn[N], h[N];
- bool red[N];
- void dfs(int x, int par = 0) {
- if(par) h[x] = h[par] + 1;
- d[0][x] = par;
- for(int i = 1; i <= 20; i ++)
- d[i][x] = d[i - 1][d[i - 1][x]];
- tin[x] = ++ timer;
- for(auto to : g[x]) {
- if(to == par) continue;
- dfs(to, x);
- }
- tout[x] = ++ timer;
- }
- inline bool is_par(int a, int b) {
- return (tin[a] <= tin[b] && tout[a] >= tout[b]);
- }
- inline int get_lca(int a, int b) {
- if(is_par(a, b)) return a;
- if(is_par(b, a)) return b;
- int v = a;
- for(int i = 20; i >= 0; i --)
- if(d[i][v] && !is_par(d[i][v], b))
- v = d[i][v];
- return d[0][v];
- }
- int dist(int a, int b) {
- return h[a] + h[b] - 2 * h[get_lca(a, b)];
- }
- void jfs(int x, int par = 0) {
- if(red[x]) mn[x] = 0;
- for(auto to : g[x]) {
- if(to == par) continue;
- jfs(to, x);
- mn[x] = min(mn[x], mn[to] + 1);
- }
- }
- void gfs(int x, int par = 0) {
- if(red[x]) mn[x] = 0;
- mn[x] = min(mn[x], mn[par] + 1);
- for(auto to : g[x]) {
- if(to == par) continue;
- gfs(to, x);
- }
- }
- int main() {
- unsigned int FOR;
- asm("rdtsc" : "=A"(FOR));
- srand(FOR);
- scanf("%d%d", &n, &m);
- for(int i = 1, x, y; i < n; i ++) {
- scanf("%d%d", &x, &y);
- g[x].pb(y), g[y].pb(x);
- }
- for(int i = 1; i <= n; i ++)
- mn[i] = inf;
- red[1] = 1;
- dfs(1), jfs(1), gfs(1);
- int sqrt_m = sqrt(m);
- if(sqrt_m * sqrt_m < m) sqrt_m ++;
- for(int i = 1, type, x; i <= m; i ++) {
- scanf("%d%d", &type, &x);
- if(type == 1) {
- tmp.pb(x), red[x] = 1;
- } else {
- int res = mn[x];
- for(auto j : tmp) res = min(res, dist(x, j));
- printf("%d\n", res);
- }
- if(sz(tmp) == sqrt_m)
- tmp.clear(), jfs(1), gfs(1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement