#include <vector> #include <set> #include <algorithm> #include <cctype> #include <cstdlib> #include <cmath> #include <stack> #include <queue> #include <cstring> #include <string> #include <cstdio> #include <climits> #define PII pair < int , int > #define MP make_pair #define PB push_back #define F first #define S second #define LL long long #define NMAX 100009 #define sigma 26 using namespace std; vector < int > g[NMAX]; int t[NMAX],dp[NMAX][sigma]; int x,y,j,cx,cy,ans,lca,N,M,i,node,type; bool m[NMAX]; char c,let[NMAX]; void df(int n,int fa) { t[n]=fa; for (int i=0;i<=25;++i) dp[n][i]+=dp[fa][i]; for (int i=0;i<g[n].size();++i) if (g[n][i]!=fa) df(g[n][i],n); } int main() { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif scanf("%d%d\n",&N,&M); for (i=1;i<=N;++i) { scanf("%c",&c); let[i]=c; dp[i][c-'a']++; } node=N; for (i=1;i<=N-1;++i) { scanf("%d%d",&x,&y); g[x].push_back(y); g[y].push_back(x); } df(1,0); for (i=1;i<=M;++i) { scanf("%d",&type); if (type==2) { scanf("%d %c\n",&x,&c); t[++node]=x; let[node]=c; memcpy(dp[node],dp[x],sizeof(dp[x])); ++dp[node][c-'a']; continue; } if (type==1) { scanf("%d%d",&x,&y); cx=x;ans=0; while (cx) { m[cx]=true; cx=t[cx]; } cy=y;lca=0; while (cy && !lca) { if (m[cy]) lca=cy; cy=t[cy]; } for (j=0;j<=25;++j) if ((dp[x][j]+dp[y][j]-2*dp[lca][j]+(let[lca]-'a'==j))&1) ++ans; printf("%d\n",ans); while (x) { m[x]=false; x=t[x]; } } } return 0; }