#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long #define pb push_back #define mp make_pair #define pii pair #define pll pair #define all(x) (x).begin(), (x).end() #define fi first #define se second using namespace std; const int nmax = 200005; const int lmax = 19; int n, m, i, j, x, y, op, dif, lca, mlc, X, Y, lev[nmax], sum[nmax], val[nmax], f[lmax][nmax]; char c; vector v[nmax]; void dfs(int x, int d) { sum[x] = val[x] ^ sum[d]; for(auto it : v[x]) if(it != d) { f[0][it] = x; lev[it] = lev[x] + 1; dfs(it, x); } } int count(int x) { int cnt = 0; for(int i = 0; i < 30; i++) if((1 << i) & x) cnt++; return cnt; } int main() { cin.sync_with_stdio(false); // freopen("test.in", "r", stdin); // freopen("test.out", "w", stdout); cin >> n >> m; for(i = 1; i <= n; i++) { cin >> c; val[i] = 1 << (c - 'a'); } for(i = 1; i < n; i++) { cin >> x >> y; v[x].pb(y); v[y].pb(x); } lev[1] = 1; dfs(1, 0); for(i = 1; (1 << i) <= n; i++) for(j = 1; j <= n; j++) f[i][j] = f[i - 1][f[i - 1][j]]; for(; m; m--) { cin >> op; if(op == 2) { cin >> x >> c; ++n; f[0][n] = x; val[n] = 1 << (c - 'a'); sum[n] = sum[x] ^ val[n]; lev[n] = lev[x] + 1; for(i = 1; (1 << i) <= n; i++) f[i][n] = f[i - 1][f[i - 1][n]]; } else { cin >> x >> y; if(lev[x] > lev[y]) swap(x, y); X = x; Y = y; dif = lev[y] - lev[x]; for(i = 0; i < 18; i++) if((1 << i) & dif) y = f[i][y]; if(x == y) lca = x; else { for(i = 17; i >= 0; i--) if(f[i][x] != f[i][y]) { x = f[i][x]; y = f[i][y]; } lca = f[0][x]; } if(lca == x) mlc = sum[Y] ^ sum[f[0][X]]; else mlc = sum[X] ^ sum[f[0][lca]] ^ sum[Y] ^ sum[f[0][lca]] ^ val[lca]; cout << count(mlc) << '\n'; } } return 0; }