#include<bits/stdc++.h>usingnamespacestd;constintINF=1e9+7;intN,M;vector<vector<int>>adj,up;vector<int>parent,dist,dpth,sz;vector<bool>v;intfind_size(intn,intp){if(v[n])return0;sz[n]=1;for(autoc:adj[n]){if(c!=p){sz[n]+=find_size(c,n);}}returnsz[n];}// centroid treeintfind_centroid(intn,intp,intmx){for(autoc:adj[n]){if(c!=p){if(!v[c]&&sz[c]*2>mx){returnfind_centroid(c,n,mx);}}}returnn;}voidinit_centroid(intn,intp){find_size(n,-1);intc=find_centroid(n,0,sz[n]);v[c]=true;parent[c]=p;for(intx:adj[c]){if(!v[x]){init_centroid(x,c);}}}voiddfs(intn,intp){dpth[n]=dpth[p]+1;//jump table for node nup[n][0]=p;for(inti=1;i<20;i++){up[n][i]=up[up[n][i-1]][i-1];}for(autoc:adj[n]){if(c!=p){dfs(c,n);}}}// lcaintlca(inta,intb){if(dpth[a]<dpth[b])swap(a,b);intdiff=dpth[a]-dpth[b];for(inti=0;i<20;i++){if((diff>>i)&1){a=up[a][i];}}if(a==b)returna;for(inti=19;i>=0;i--){intap=up[a][i];intbp=up[b][i];if(ap!=bp){a=ap;b=bp;}}returnup[a][0];}intfind_dist(intn,intp){intvlca=lca(n,p);intd1=abs(dpth[n]-dpth[vlca]);intd2=abs(dpth[p]-dpth[vlca]);returnd1+d2;}// go up ancestors + upd query valvoidupd(intn){intp=n;dist[n]=0;while(parent[p]!=0){p=parent[p];dist[p]=min(dist[p],find_dist(n,p));}}// go up ancestors + find ans (dist(n, anc) + dist[anc])intquery(intn){intp=n;intans=dist[p];while(parent[p]!=0){p=parent[p];ints=find_dist(n,p)+dist[p];ans=min(ans,s);}returnans;}intmain(){cin>>N>>M;adj.resize(N+1);dist.resize(N+1,INF);parent.resize(N+1);dpth.resize(N+1);v.resize(N+1);sz.resize(N+1);up.resize(N+1,vector<int>(20));for(inti=0;i<N-1;i++){inta,b;cin>>a>>b;adj[a].push_back(b);adj[b].push_back(a);}dfs(1,0);init_centroid(1,0);upd(1);for(inti=0;i<M;i++){inta,b;cin>>a>>b;if(a==1){upd(b);}else{cout<<query(b)<<endl;}}}
#include<bits/stdc++.h>usingnamespacestd;#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define FORE(i, a, b) for (int i = (a); i <= (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define trav(a, x) for (auto &a : x)
#define f first
#define s second
#define bk back()
#define pb push_back
#define sz(x) int((x).size())
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
intN,Q;constintMX=2e5+5;usingT=longlong;// or long longconstTEPS=1e-9;// might want to changeusingP=pair<T,T>;usingvP=vector<P>;usingLine=pair<P,P>;Tsq(Ta){returna*a;}// squareTnorm(constP&p){returnsq(p.f)+sq(p.s);}// x^2 + y^2// basic operationsPoperator-(constP&l,constP&r){returnP(l.f-r.f,l.s-r.s);}Tcross(constP&a,constP&b){returna.f*b.s-a.s*b.f;}// cross productTcross(constP&p,constP&a,constP&b){// cross productreturncross(a-p,b-p);}usingvi=vector<int>;usingvP=vector<P>;inthullInd(constvP&v){intind=int(min_element(all(v))-begin(v));vicand,hull{ind};F0R(i,sz(v))if(v[i]!=v[ind])cand.pb(i);sort(all(cand),[&](inta,intb){// sort by angle, tiebreak by distancePx=v[a]-v[ind],y=v[b]-v[ind];Tt=cross(x,y);returnt!=0?t>0:norm(x)<norm(y);});trav(c,cand){// for every pointwhile(sz(hull)>1&&cross(v[end(hull)[-2]],v[hull.bk],v[c])<=0){hull.pop_back();// pop until counterclockwise and size > 1}hull.pb(c);}/*cout << "[";
for (auto i : hull) {
cout << "[" << v[i].f << ", " << v[i].s << "], ";
}
cout << "]" << endl;*/longlongans=0;for(inti=0;i<hull.size();i++){for(intj=i+1;j<hull.size();j++){ans=max(ans,norm(v[hull[i]]-v[hull[j]]));}}returnans;}intmain(){ios_base::sync_with_stdio(0);cin.tie(0);intc;cin>>c;vPpts(c);F0R(i,c){longlonga,b;cin>>a>>b;pts[i]=P(a,b);}intret=hullInd(pts);// gets hull indices of convex hullcout<<sqrt(ret)<<endl;}