func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 7;   vector<int> ad[N];   int h[N], n, m, dp[N][30];   int d[N], R = 320;   vector<int> red;   void dfs(int v, int p) {     h[v] = h[p] + 1;     dp[v][1] = p;     for (auto u : ad[v]) {       if (u != p) dfs(u, v);     }   }   int dis(int u, int v) {     int res = 0;     if (h[v] < h[u]) swap(v, u);     for (int i = 20; i >= 1; i--) {       if (h[v] - (1 << (i - 1)) >= h[u]) {         res += (1 << (i - 1));         v = dp[v][i];       }     }     if (u == v) return res;     for (int i = 20; i >= 1; i--) {       if (dp[v][i] != dp[u][i]) {         res += 2 * (1 << (i - 1));         v = dp[v][i];         u = dp[u][i];       }     }     return res + 2;   }   void bfs() {     deque<int> dq;     memset(d, 0, sizeof d);     for (auto u : red) dq.push_back(u), d[u] = 1;     while (dq.size()) {       int v = dq[0];       dq.pop_front();       for (auto u : ad[v]) {         if (!d[u]) d[u] = d[v] + 1, dq.push_back(u);       }     }   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cin >> n >> m;     for (int i = 1; i < n; i++) {       int u, v;       cin >> u >> v;       ad[u].push_back(v);       ad[v].push_back(u);     }     for (int i = 1; i <= n; i++) dp[i][0] = i;     dfs(1, 0);     for (int j = 2; j <= 20; j++)       for (int i = 1; i <= n; i++) dp[i][j] = dp[dp[i][j - 1]][j - 1];     vector<int> pos;     red.push_back(1);     bfs();     while (m--) {       int t;       cin >> t;       if (t == 1) {         int tt;         cin >> tt;         pos.push_back(tt);         if (pos.size() > R) {           for (auto u : pos) {             red.push_back(u);           }           bfs();           pos.clear();         }       } else {         int v;         cin >> v;         int res = d[v] - 1;         for (auto u : pos) res = min(res, dis(v, u));         cout << res <<   n ;       }     }     return 0;   }   