#include typedef struct { int tata; char c; } 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 = 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]; } else { resetChars(); gata = ans = 0; while(nn[x].tata) { ++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]; if(chars[nn[y].c - 97] & 1) ++ans; else --ans; y = nn[y].tata; } ++chars[nn[y].c - 97]; if(chars[nn[y].c - 97] & 1) ++ans; else --ans; } printf("%d\n", ans); } } }