#include #include #include #include using namespace std; #define INF 999999999 int n,m; pair queries[100011]; int qL=0; char Letter[200011]; char inp[100011]; vector Graph[200011]; int Amount[26][200011]; ///LCA int IT[1200001]; int LEAFOFFSET; int L=0; int inctr=0; int WhoIs[200011]; int FirstSeen[200011]; int In[200011]; void DFS(int ver,int dad) { int i,j; inctr++; L++; IT[L+LEAFOFFSET]=inctr; FirstSeen[ver]=L; WhoIs[inctr]=ver; In[ver]=inctr; for (i=0;ir || R=l && R<=r) { return IT[ver]; } else { return MIN( MinRec(2*ver,L,(L+R)/2,l,r) , MinRec(2*ver+1,(L+R)/2+1,R,l,r) ); } } int GetMin(int L,int R) { return MinRec(1,1,LEAFOFFSET+1,L,R); } int LCA(int a,int b) { int L,R; int d; L=FirstSeen[a]; R=FirstSeen[b]; if (L>R) { d=L; L=R; R=d; } return WhoIs[ GetMin(L,R) ]; } int main() { //freopen("test.txt","r",stdin); int i,j; int cm,x,y; char ch; int ans=0,amnt=0; int LC; int a,b; scanf("%d %d",&n,&m); LEAFOFFSET=1; while(LEAFOFFSET<2*n+2) LEAFOFFSET*=2; LEAFOFFSET--; scanf("%s",inp+1); for (i=1;i<=n;i++) { Letter[i]=inp[i]; } for (i=1;i<=n-1;i++) { scanf("%d %d",&a,&b); Graph[a].push_back(b); Graph[b].push_back(a); } for (i=1;i<=m;i++) { scanf("%d",&cm); if (cm==1) { scanf("%d %d",&x,&y); qL++; queries[qL].first=x; queries[qL].second=y; } else { scanf("%d",&x); ch='.'; while(ch<'a' || ch>'z') { scanf("%c",&ch); } n++; Graph[x].push_back(n); Graph[n].push_back(x); Letter[n]=ch; } } memset(Amount,0,sizeof(Amount)); Amount[ Letter[1]-'a' ][1]=1; DFS(1,0); for (i=LEAFOFFSET;i>=1;i--) { IT[i]=MIN(IT[2*i],IT[2*i+1]); } for (i=1;i<=qL;i++) { x=queries[i].first; y=queries[i].second; LC=LCA(x,y); ans=0; for (j=0;j<=25;j++) { amnt=Amount[j][x]+Amount[j][y]-2*Amount[j][LC]; if (Letter[LC]-'a'==j) amnt++; if (amnt%2==1) ans++; } printf("%d\n",ans); } return 0; }