#include <cstdio> #include <algorithm> #include <vector> using namespace std; #define mlog 20 #define sigma 26 #define maxn 200010 int n, m; int st[mlog][maxn], lvl[maxn]; int sum[maxn][sigma]; vector<int> v[maxn]; char s[maxn]; void update(int tata, int nod) { st[0][nod]=tata; lvl[nod]=lvl[tata]+1; for(int i=1; st[i-1][st[i-1][nod]]!=0; ++i) st[i][nod]=st[i-1][st[i-1][nod]]; for(int i=0; i<sigma; ++i) sum[nod][i]=sum[tata][i]; sum[nod][s[nod]-'a']++; } void df(int tata, int nod) { update(tata, nod); for(int i=0; i<v[nod].size(); ++i) { if(v[nod][i]==tata) continue; df(nod, v[nod][i]); } } int lca(int x, int y) { if(lvl[x]>lvl[y]) swap(x, y); for(int i=mlog-1; i>=0; --i) if(lvl[st[i][y]]>=lvl[x]) y=st[i][y]; if(x==y) return x; for(int i=mlog-1; i>=0; --i) if(st[i][y]!=st[i][x]) { y=st[i][y]; x=st[i][x]; } x=st[0][x]; return x; } int main() { // freopen("tree.in", "r", stdin); scanf("%d%d\n", &n, &m); scanf("%s\n", s+1); for(int i=1; i<n; ++i) { int a, b; scanf("%d%d", &a, &b); v[a].push_back(b); v[b].push_back(a); } df(0, 1); while(m--) { int tip; scanf("%d", &tip); if(tip==1) { int a, b, c, sol=0; scanf("%d%d", &a, &b); c=lca(a, b); for(int i=0; i<sigma; ++i) if((sum[a][i]+sum[b][i]-sum[c][i]-sum[st[0][c]][i])%2==1) ++sol; printf("%d\n", sol); } else { int a; char c; scanf("%d %c", &a, &c); s[++n]=c; update(a, n); } } return 0; }