#include struct cel { int urm; cel* adr; }; typedef cel* lda1; lda1 lda[200005]; int papasa[200005][20]; int niv[200005]; char litera[200005]; int sum[200005][30],trecut[200005],puteri[25]; int sdif[200005]; void parc(int nod,int tata) { niv[nod]=niv[tata]+1; trecut[nod]=1; for (int i=0;i<26;++i) sum[nod][i]=sum[tata][i]; sum[nod][litera[nod]-'a']++; papasa[nod][0]=tata; for (int i=0;i<20;++i) { if (niv[nod]>puteri[i]) { papasa[nod][puteri[i]]=papasa[papasa[nod][puteri[i-1]]][puteri[i-1]]; } } for (lda1 p = lda[nod];p!=0;p=p->adr) { if (trecut[p->urm]==0) { parc(p->urm,nod); } } } int main() { int n,m; scanf("%d %d",&n,&m); char s[100005]; scanf(" %s",&s); for (int i=0;iurm=a; x->adr=lda[b]; lda[b]=x; x = new cel; x->urm = b; x->adr = lda[a]; lda[a]=x; } puteri[0]=1; for (int i=1;i<=20;++i) { puteri[i]=puteri[i-1]*2; } int j=0; for (int i=1;i<=200000;++i) { if (puteri[j]==i) { ++j; } sdif[i]=j-1; } parc(1,0); for (;m>0;--m) { int tip; scanf("%d",&tip); if (tip==1) { int x,y; scanf("%d %d",&x,&y); if (niv[x]0 && papasa[h][j]==papasa[h2][j]) --j; h=papasa[h][j]; h2=papasa[h2][j]; } int solf=0; for (int i=0;i<26;++i) { if (x!=h) { if ((sum[x][i]-sum[papasa[h][0]][i]+sum[y][i]-sum[h][i])%2==1) { ++solf; } } } printf("%d\n",solf); }else { int x; char c; scanf("%d",&x); scanf(" %c",&c); ++n; niv[n]=niv[x]+1; litera[n]=c; for (int i=0;i<26;++i) { sum[n][i]=sum[x][i]; } sum[n][c-'a']++; papasa[n][0]=x; for (int i=0;i<20;++i) { if (niv[n]>puteri[i]) { papasa[n][puteri[i]]=papasa[papasa[n][puteri[i-1]]][puteri[i-1]]; } } } } return 0; }