#include <iostream> #include <fstream> using namespace std; //ifstream f("wow.in"); #include <vector> #define LE 200666 #define x first #define y second #define mp make_pair #define pb push_back #define f cin int rmq[20][LE]; int lev[LE],ch[LE][30]; bool viz[LE]; pair<int,int> Qs[LE]; vector<int> H[LE]; int C[LE],lmax; void dfs(int nod) { int N=H[nod].size(),i; viz[nod]=true; ++ch[nod][C[nod]]; for(i=0; i<N; ++i) { int D=H[nod][i]; if (viz[D]==false) { rmq[0][D]=nod; lev[D]=lev[nod]+1; for(int j=0; j<26; ++j) ch[D][j]=ch[nod][j]; dfs(D); } } } int lca(int nod1,int nod2) { if (lev[nod1]>lev[nod2]) swap(nod1,nod2); int D=lev[nod2]-lev[nod1],i; for(i=lmax; i>=0; --i) if (D&(1<<i)) nod2=rmq[i][nod2]; if (nod1==nod2) return nod1; for(i=lmax; i>=0; --i) if (rmq[i][nod1]!=rmq[i][nod2]) nod1=rmq[i][nod1],nod2=rmq[i][nod2]; return rmq[0][nod1]; } string str; int R[666]; int main() { int n,m,i,k=0,l=0; f>>n>>m; f.get(); f>>str; for(i=0; i<n; ++i) C[i+1]=str[i]-'a'; for(i=1; i<n; ++i) { int xx,yy;; f>>xx>>yy; H[xx].pb(yy); H[yy].pb(xx); } for(i=1; i<=m; ++i) { int xx,yy,typ; char cc; f>>typ; if (typ==1) { f>>xx>>yy; Qs[++k]=mp(xx,yy); } if (typ==2) { f>>xx>>cc; ++n; cc-='a'; C[n]=cc; H[xx].pb(n); H[n].pb(xx); } } dfs(1); for(l=1; (1<<l)<=n; ++l) for(i=1; i<=n; ++i) rmq[l][i]=rmq[l-1][rmq[l-1][i]]; lmax=l-1; for(i=1; i<=k; ++i) { int j; for(j=0; j<26; ++j) R[j]=ch[Qs[i].x][j]+ch[Qs[i].y][j]; int L=lca(Qs[i].x,Qs[i].y); for(j=0; j<26; ++j) R[j]-=2*ch[L][j]; ++R[C[L]]; int result=0; for(j=0; j<26; ++j) result+=R[j]%2; cout<<result<<'\n'; } return 0; }