#include typedef struct { int tata; char c; int nivel; } NODE; NODE nn[100001]; int n, m, x, y, t, chars[26], ans, gata; char sir[100001]; void resetChars() { for(int i = 0; i < 26; ++i) { chars[i] = 0; } } int main() { //FILE *f = fopen("in.in", "r"); //fscanf(f, "%d%d", &n, &m); scanf("%d%d", &n, &m); scanf("%s", sir); for(int i = 0; i < n; ++i) { nn[i + 1].c = sir[i]; } for(int i = 0; i < n - 1; ++i) { scanf("%d%d", &x, &y); nn[y].tata = x; } for(int i = 1; i <= n; ++i) { int temp = i, nivel = 0; while(nn[temp].tata) { ++nivel; temp = nn[temp].tata; } nn[i].nivel = nivel; } for(int i = 0; i < m; ++i) { //fscanf(f, "%d", &t); scanf("%d", &t); if(t == 2) { //fscanf(f, "%d%s", &x, sir); scanf("%d%s", &x, sir); } else scanf("%d%d", &x, &y); //fscanf(f, "%d%d", &x, &y); if(t == 2) { nn[++n].tata = x; nn[n].c = sir[0]; nn[n].nivel = nn[x].nivel + 1; } else { resetChars(); gata = ans = 0; if(nn[x].nivel < nn[y].nivel) { int temp = x; x = y; y = temp; } while(nn[x].tata) { chars[nn[x].c - 97] = 1 - chars[nn[x].c - 97]; if(chars[nn[x].c - 97] & 1) ++ans; else --ans; if(x == y) { gata = 1; break; } x = nn[x].tata; } if(!gata) { while(nn[y].tata) { chars[nn[y].c - 97] = 1 - chars[nn[y].c - 97]; if(chars[nn[y].c - 97] & 1) ++ans; else --ans; y = nn[y].tata; } chars[nn[y].c - 97] = 1 - chars[nn[y].c - 97]; if(chars[nn[y].c - 97] & 1) ++ans; else --ans; } printf("%d\n", ans); } } }