Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _USE_MATH_DEFINES
- #include<iostream>
- #include<fstream>
- #include<string>
- #include<vector>
- #include<utility>
- #include<algorithm>
- #include<climits>
- #include<set>
- #include<map>
- #include<cmath>
- #include<iomanip>
- #include<iterator>
- #include<queue>
- #include<stack>
- #include<cctype>
- #include<deque>
- #include<time.h>
- #include<bitset>
- #include<random>
- #include<unordered_set>
- #include<unordered_map>
- #include<sstream>
- #include<random>
- #include<numeric>
- //by Skeef79
- typedef long long ll;
- typedef long double ld;
- typedef unsigned long long ull;
- #pragma warning(disable : 4996)
- #pragma comment(linker, "/STACK:16777216")
- #define pb push_back
- #define en '\n'
- #define for0(i,n) for(int i = 0;i<n;i++)
- #define all(x) (x).begin(),(x).end()
- #define rall(x) (x).rbegin(),(x).rend()
- #define vec vector
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define what_is(x) cout<<#x<<" is "<<x<<en;
- using namespace std;
- const int INF = 2000000000;
- const ll LINF = 2000000000000000000;
- template<typename T> void print(vector<T>& a)
- {
- for (int i = 0; i < a.size(); i++)
- cout << a[i] << ' ';
- cout << en;
- }
- template<typename T> void print(deque<T>& a)
- {
- for (int i = 0; i < a.size(); i++)
- cout << a[i] << ' ';
- cout << en;
- }
- template<typename T> void print(vector<vector<T>>& a)
- {
- for (int i = 0; i < a.size(); i++)
- {
- for (int j = 0; j < a[i].size(); j++)
- cout << a[i][j] << ' ';
- cout << en;
- }
- }
- template <typename T> void input(vector<T>& a)
- {
- for (int i = 0; i < a.size(); i++)
- cin >> a[i];
- }
- template<typename T> void input(deque<T>& a)
- {
- for (int i = 0; i < a.size(); i++)
- cin >> a[i];
- }
- template<typename T> void input(vector<vector<T>>& a)
- {
- for (int i = 0; i < a.size(); i++)
- for (int j = 0; j < a[i].size(); j++)
- cin >> a[i][j];
- }
- int n, m, K = 365;
- const int LOG = 17;
- vector<vector<int>>g;
- vector<int>d;
- vector<bool>c;
- vector<int>lvl;
- vector<vector<int>>jump;
- vector<int> added;
- void dfs(int v, int p = 0, int level = 0)
- {
- jump[v][0] = p;
- lvl[v] = level;
- for (int to : g[v])
- if (to != p)
- dfs(to, v, level + 1);
- }
- void initJump()
- {
- for (int k = 1; k < LOG; k++)
- for (int v = 0; v < n; v++)
- jump[v][k] = jump[jump[v][k - 1]][k - 1];
- }
- void initLCA()
- {
- lvl = vector<int>(n);
- jump = vector<vector<int>>(n, vector<int>(LOG));
- dfs(0);
- initJump();
- }
- int lca(int u, int v)
- {
- if (lvl[u] > lvl[v])
- swap(u, v);
- for (int k = LOG - 1; k >= 0; k--)
- if (lvl[u] <= lvl[jump[v][k]])
- v = jump[v][k];
- if (u == v)
- return v;
- for (int k = LOG - 1; k >= 0; k--)
- if (jump[v][k] != jump[u][k])
- {
- v = jump[v][k];
- u = jump[u][k];
- }
- return jump[u][0];
- }
- void rebuild()
- {
- fill(all(d), INF);
- queue<int>q;
- for (int v = 0; v < n; v++)
- if (c[v])
- {
- d[v] = 0;
- q.push(v);
- }
- while (!q.empty())
- {
- int v = q.front();
- q.pop();
- for (int to : g[v])
- if (d[v] + 1 < d[to])
- {
- d[to] = d[v] + 1;
- q.push(to);
- }
- }
- }
- int path(int u, int v)
- {
- return lvl[u] + lvl[v] - 2 * lvl[lca(u, v)];
- }
- int query(int v)
- {
- int ans = d[v];
- for (int to : added)
- ans = min(ans, path(v, to));
- return ans;
- }
- void solve()
- {
- scanf("%d%d", &n, &m);
- g = vector<vector<int>>(n);
- d = vector<int>(n,INF);
- c = vector<bool>(n);
- added.reserve(K);
- c[0] = true;
- for (int i = 0; i < n - 1; i++)
- {
- int u, v;
- scanf("%d%d", &u, &v);
- u--, v--;
- g[u].pb(v);
- g[v].pb(u);
- }
- rebuild();
- initLCA();
- int type, v;
- for (int i = 0; i < m; i++)
- {
- if (i%K == 0)
- {
- rebuild();
- added.clear();
- }
- scanf("%d%d", &type, &v);
- if (type == 1)
- {
- added.pb(v - 1);
- c[v - 1] = true;
- }
- else
- printf("%d\n",query(v - 1));
- }
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- #endif
- int tst = 1;
- //cin >> tst;
- while (tst--)
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement