#include <stdio.h> #include <iostream> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <cstring> #define maxdim 200005 using namespace std; int n, op; int S[26][maxdim], niv[maxdim], P[21][maxdim]; char letters[maxdim]; vector<int> G[maxdim]; void dfs(int nod, int t) { ++S[letters[nod]-'a'][nod]; niv[nod] = niv[t]+1; for (int son : G[nod]) { if (son != t) { for (int i = 0; i < 26; ++i) { S[i][son] = S[i][nod]; } P[0][son] = nod; dfs(son, nod); } } } int lca(int x, int y) { if(niv[x] < niv[y]) swap(x, y); int log1, log2; for(log1 = 1; (1 << log1) < niv[x]; ++log1); for(log2 = 1; (1 << log2) < niv[y]; ++log2); for(int k = log1; k >= 0; --k) if(niv[x] - (1 << k) >= niv[y]) x = P[k][x]; if(x == y) return x; for(int k = log2; k >= 0; --k) if(P[k][x] && P[k][x] != P[k][y]) x = P[k][x], y = P[k][y]; return P[0][x]; } int main() { #ifndef ONLINE_JUDGE freopen("p.in", "r", stdin); freopen("p.out", "w", stdout); #endif scanf("%d %d\n%s", &n, &op, letters+1); for (int i = 1; i < n; ++i) { int x, y; scanf("%d %d", &x, &y); G[x].push_back(y); G[y].push_back(x); } dfs(1, 0); for (int p = 1; (1<<p) <= n; ++p) { for (int i = 1; i <= n; ++i) { P[p][i] = P[p-1][P[p-1][i]]; } } while (op--) { int type; scanf("%d", &type); if (type == 2) { int x; char l; scanf("%d %c", &x, &l); ++n; for (int i = 0; i < 26; ++i) { S[i][n] = S[i][x]; } P[0][n] = x; for (int p = 1; (1<<p) <= n; ++p) { P[p][n] = P[p-1][P[p-1][n]]; } niv[n] = niv[x] + 1; ++S[l-'a'][n]; letters[n] = l; } else { int x, y; scanf("%d %d", &x, &y); int sol = 0; int lca_node = lca(x, y); // printf("%d\n", lca_node); for (int i = 0; i < 26; ++i) { if ((S[i][x] + S[i][y] - 2 * S[i][lca_node] + (letters[lca_node]-'a' == i)) & 1) { // printf("%d %d %d--------%d\n", S[i][x], S[i][y], S[i][lca_node], i); ++sol; } } printf("%d\n", sol); } } return 0; }