#include #include using namespace std; #define dim 100005 int n,m; string s; vector v[2*dim]; int mask[2*dim]; int T[20][2*dim]; int lvl[2*dim]; void dfs(int s,int father,int Level){ lvl[s] = Level; T[0][s] = father; mask[s] ^= mask[father]; for(int i = 0; i < v[s].size(); i++) if(v[s][i] != father) dfs(v[s][i],s,Level+1); } void build_lca(){ for(int k = 1; (1 << k) <= n; k++) for(int i = 1; i <= n; i++) T[k][i] = T[k-1][T[k-1][i]]; } int lca(int x,int y){ if(lvl[x] < lvl[y]){ x ^= y; y ^= x; x ^= y; } int log1,log2; for(log1 = 1; (1 << log1) < lvl[x]; log1++); for(log2 = 1; (1 << log2) < lvl[y]; log2++); for(int k = log1; k >= 0; k--) if(lvl[x] - (1 << k) >= lvl[y]) x = T[k][x]; if(x == y) return x; for(int k = log2; k >= 0; k--) if(T[k][x] > 0 && T[k][x] != T[k][y]){ x = T[k][x]; y = T[k][y]; } return T[0][x]; } void update(int nod,char c){ n++; mask[n] |= (1 << (c - 'a')); mask[n] ^= mask[nod]; lvl[n] = lvl[nod]+1; T[0][n] = nod; for(int k = 1; (1 << k) <= n; k++) T[k][n] = T[k-1][T[k-1][n]]; } int main(){ cin >> n >> m >> s; for(int i = 1; i <= n; i++) mask[i] |= (1 << (s[i-1] - 'a')); for(int i = 1; i < n; i++){ int x,y; cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } dfs(1,0,0); build_lca(); while(m--){ int t; cin >> t; if(t == 1){ int x,y; cin >> x >> y; int L = lca(x,y); int maskAns; if(L != x && L != y) maskAns = mask[x]^mask[y]^mask[L]^mask[T[0][L]]; else if(L == x) maskAns = mask[y] ^ mask[T[0][x]]; else maskAns = mask[x] ^ mask[T[0][y]]; int Ans = 0; for(int i = 0; i < 26; i++) if((maskAns & (1 << i)) > 0) Ans++; cout << Ans << "\n"; } else{ int x; char c; cin >> x >> c; update(x,c); } } }