#include #include using namespace std; vector gr[200005]; int Lev[200005], T[30][200005], D[200005][30], n, m; char car[200005]; bool viz[200005]; void dfs(int k, int last, int level) { viz[k]=1; int j, i; Lev[k]=level; T[0][k]=last; for(j=0; j<='z'-'a'; j++) { D[k][j]=D[T[0][k]][j]; } D[k][car[k]-'a']++; for(i=0; i= 0; --k) if(Lev[x] - (1 << k) >= Lev[y]) x = T[k][x]; if(x == y) return x; for(int k = log2; k >= 0; --k) if(T[k][x] && T[k][x] != T[k][y]) x = T[k][x], y = T[k][y]; return T[0][x]; } int main() { //ifstream cin("a.in"); //ofstream cout("a.out"); int a, b, c, rez, nod, rad; char cr; int i, j; cin>>n>>m; for(i=1; i<=n; i++) { cin>>car[i]; } for(i=1; i>a>>b; gr[a].push_back(b); gr[b].push_back(a); //T[0][b]=a; } dfs(1, 0, 1); for(i=1; i<=25; i++) { for(j=1; j<=n; j++) { T[i][j]=T[i-1][T[i-1][j]]; } } for(i=1; i<=m; i++) { cin>>a>>b; if(a==2) { cin>>cr; n++; T[0][n]=b; Lev[n]=Lev[b]+1; for(j=1; j<=25; j++) { T[j][n]=T[j-1][T[j-1][n]]; //if(T[j][n]==0) // break; } for(j=0; j<='z'-'a'; j++) { D[n][j]=D[b][j]; } D[n][cr-'a']++; } if(a==1) { cin>>c; rez=0; nod=lca(b, c); for(j='a'-'a'; j<='z'-'a'; j++) { if((D[b][j]-D[T[0][nod]][j]-D[nod][j]+D[c][j])%2==1) rez++; } cout<