#include #include #include #include #include #include #include #include #include #define in cin #define out cout #define abs(x) ((x>0)?(x):(-(x))) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define DOWNFOR(i, a, b) for(int i = a; i >= b; --i) #define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i) using namespace std; typedef long long ll; const int Nmax = 200001; vector G[Nmax],P[Nmax]; int T[Nmax],C[Nmax],L[Nmax]; int sm[23][Nmax]; int m[Nmax],A[Nmax][30]; int N,M; void dfs(int x){ m[x]=1; FOREACH(t,G[x]) if(!m[*t]) T[*t]=x, dfs(*t); } void upd(int x){ L[x]=L[T[x]]+1; FOR(j,0,25) A[x][j]=A[T[x]][j]; A[x][int(C[x])-'a']++; sm[0][x]=T[x]; for(int k=0;sm[k][x];k++) sm[k+1][x]=sm[k][ sm[k][x] ]; } void ddfs(int x){ upd(x); FOREACH(t,P[x]) ddfs(*t); } int lca(int x,int y){ if(L[x]>L[y]) swap(x,y); int l=L[y]-L[x]; for(int k=0;(1<>N>>M; in.get(); int x,y; char c; FOR(i,1,N) in.get(c),C[i]=c; FOR(i,1,N-1){ in>>x>>y; G[x].push_back(y); G[y].push_back(x); } int root=rand()%N+1; dfs(root); FOR(i,1,N) P[T[i]].push_back(i); ddfs(root); FOR(i,1,M){ in>>x; if(x==1){ in>>x>>y; int l=lca(x,y),ans=0; FOR(j,0,25){ int f=A[x][j]+A[y][j]-A[l][j]-A[T[l]][j]; if(f%2) ans++; } out<>y>>c; T[++N]=y,C[N]=c; upd(N); //FOR(i,1,N) out<