#include #include #include #include #include #include #include #define ll long long #define pb push_back using namespace std; const int NMAX = 100003; typedef struct lnod{ int vf; lnod *next; }*Nod; Nod a[100005]; int let[200005][26]; int lev[200005]; bool viz[100005]; char lit[200005]; string s; int lca[200005][19]; void add(Nod &q, int vf){ Nod p = new lnod; p->vf = vf; p->next = q; q = p; } void dfs(int nod, int fath){ viz[nod] = 1; lev[nod] = lev[fath] + 1; for(int i=0;i<26;++i) let[nod][i] = let[fath][i]; let[nod][s[nod-1] - 'a'] ++; if(nod != 1) { lca[nod][0] = fath; for(int j=1;j<19;++j) if(lca[nod][j-1] == -1) lca[nod][j] = -1; else lca[nod][j] = lca[lca[nod][j-1]][j-1]; } for(Nod p=a[nod];p;p=p->next) if(!viz[p->vf]) { dfs(p->vf, nod); } } int main(){ #ifndef ONLINE_JUDGE freopen("C.in","r",stdin); freopen("C.out","w",stdout); #endif int N,M,x,y,j,i,op; char ch; cin >> N >> M; cin >> s; for(i=0;i> x >> y; add(a[x],y); add(a[y],x); } for(i=0;i<19;++i) lca[1][i] = -1; lca[1][0] = 0; dfs(1,0); for(i=1;i<=M;++i) { cin >> op >> x; if(op == 1) { cin >> y; int xi = x, yi = y; while(lev[xi] != lev[yi]) { if(lev[xi] > lev[yi]) { j = 0; while(lev[xi] - (1<<(j+1)) >= lev[yi]) ++j; xi = lca[xi][j]; } else { j = 0; while(lev[yi] - (1<<(j+1)) >= lev[xi]) ++j; yi = lca[yi][j]; } } int ans = 0; while(xi != yi) { j = 0; while(lca[xi][j+1] != lca[yi][j+1]) ++j; xi = lca[xi][j]; yi = lca[yi][j]; } for(j=0;j<26;++j) ans += ((let[x][j] + let[y][j] - let[xi][j] - (lca[xi][0] > 0 ? let[lca[xi][0]][j] : 0)) % 2 == 1); cout << ans << '\n'; } else { cin >> ch; ++N; lit[N] = ch; for(j=0;j<26;++j) let[N][j] = let[x][j]; let[N][ch - 'a'] ++; lev[N] = lev[x] + 1; lca[N][0] = x; for(j=1;j<19;++j) if(lca[N][j-1] == -1) lca[N][j] = -1; else lca[N][j] = lca[lca[N][j-1]][j-1]; } } return 0; }