#include <cstdio> #include <vector> using namespace std; struct Node { char l; Node *parent; }; int n,m, x, y, c, p, ans; char l; vector<Node*> tree; long long f[30]; void odd(int s, bool last=true) { Node *p = tree[s]; if (p == NULL) return; while (p->parent != NULL) { f[p->l - 'a']++; p = p->parent; } if (last) f[p->l - 'a']++; } int main () { scanf("%d %d\n", &n, &m); tree.push_back(new Node); for (int i=0; i<n; ++i) { tree.push_back(new Node); scanf("%c", &tree[i+1]->l); tree[i+1]->parent = NULL; } scanf("%c", &l); for (int i=0; i<n-1;++i) { scanf("%d %d", &x, &y); tree[y]->parent = tree[x]; } ++n; for (;m;--m) { scanf("%d ", &c); if (c == 2) { scanf("%d %c", &p, &l); tree.push_back(new Node); tree[n]->l = l; tree[n]->parent = tree[p]; ++n; } else if (c == 1) { for (int i=0; i<30; ++i) f[i] = 0; scanf("%d %d", &x, &y); odd(x); odd(y, false); ans = 0; for (int i=0; i<26; ++i) if (f[i] %2 == 1) ans++; printf("%d\n", ans); } } return 0; }