#include #include #include #include #include #include #define pii pair #define fi first #define se second #define mp make_pair #define pb push_back using namespace std; const int NMAX = 200005; const int Nmax = 200005; int aib[NMAX], nn, stramos[22][Nmax];; int ind, First[NMAX], Last[NMAX], niv[NMAX]; vectorTree[Nmax]; inline void Update(int x,int y,int val){ for(;x <= nn;x += x & -x) aib[x] += val; for(y++;y <= nn;y += y & -y) aib[y] -= val; } inline int Query(int x){ int ret = 0; for(;x > 0; x -= x & -x) ret += aib[x]; return ret; } inline void Euler1(const int node,const int level){ First[node] = ++ind; niv[node] = level; for(vector ::iterator it = Tree[node].begin(); it != Tree[node].end(); ++it) if(First[*it]==0) Euler1(*it,level+1); Last[node] = ++ind; } int RMQ[Nmax][22], n, N, M,pos[Nmax], Log2[Nmax], Root = 1; vector < pii > Euler; inline void Read() { //freopen("date.in","r",stdin); //freopen("date.out","w",stdout); cin.sync_with_stdio(false); cin >>N >> M; int i, X, Y; for(i = 1;i < N; ++i) { cin >> X >> Y; Tree[X].pb(Y); Tree[Y].pb(X); } nn=2*N; } inline void _Euler(const int _node,const int f,const int height) { pos[_node] = ++n; Euler.pb(mp(_node,height)); vector::iterator it; stramos[0][_node] = f; for(it = Tree[_node].begin();it!=Tree[_node].end();++it) { if(pos[*it]!=0) continue; _Euler(*it,_node,height+1); Euler.pb(mp(_node,height)); n++; } } inline void _RMQ() { int i, j, p1, p2; for(i = 1;i <= n; ++i) RMQ[i][0] = i; for(j = 1;(1<>1]+1; } inline int LCA(int X,int Y) { if(X==Y) return X; X = pos[X]; Y = pos[Y]; if(X > Y) swap(X,Y); int D = Y-X+1,L, p1, p2; L = Log2[D]; p1 = RMQ[X][L]; p2 = RMQ[X+D-(1<0) { ret = st; Right = mid-1; } else Left = mid+1; } return ret; } int main() { Read(); Euler.pb(mp(0,0)); _Euler(Root,0,0); Euler1(1,1); _RMQ(); for(int i=1;(1<> op; if(op==1) { cin >> x; Update(First[1],First[boss],-1); boss = x; Update(First[1],First[boss],1); } else { cin >> x >> y; int lca = LCA(x,y); //cout<<"x="<