#include #include using namespace std; int y,q,T,k,j,n,m,ras,i,x,c[100004],lit[30]; bool viz[100004]; char c1,s[100004]; struct nod { int val; nod *urm; }*a[100003]; void add(nod *&x,int y) { nod *p; p=new nod; p->val=y; p->urm=x; x=p; } void DFS(int n) { nod *p; viz[n]=1; for(p=a[n];p!=0;p=p->urm) { if(p->val==y)q=1; if(viz[p->val]==0&&q==0)DFS(p->val); if(q==1){k++;c[k]=n;break;} } } int main() { //freopen("input","r",stdin); //freopen("output","w",stdout); scanf("%d %d\n",&n,&m); gets(s+1); s[0]=48; for(i=1;i<=n-1;i++) { scanf("%d %d",&x,&y); add(a[x],y); add(a[y],x); } for(i=1;i<=m;i++) { scanf("%d",&T); if(T==2) { scanf("%d %c",&x,&c1); n++; s[n]=c1; add(a[x],n); add(a[n],x); } else { scanf("%d %d",&x,&y); q=0; memset(viz,0,sizeof(viz)); memset(lit,0,sizeof(lit)); k=0; DFS(x); lit[s[y]-96]=1; ras=1; for(j=1;j<=k;j++) { lit[s[c[j]]-96]++; lit[s[c[j]]-96]%=2; if(lit[s[c[j]]-96]==0)ras--; else ras++; } printf("%d\n",ras); } } return 0; }