#include #include #include using namespace std; const int NMAX = 200000; vector v[NMAX + 1]; int n, m, nr; int ap[NMAX + 1][26], t[NMAX + 1]; bool viz[NMAX + 1]; char ch[NMAX + 2]; int K; int L[NMAX], H[NMAX],Lg[NMAX], First[NMAX]; int Rmq[19][NMAX]; void dfs (int nod) { int fiu; viz[nod] = true; memcpy (ap[nod], ap[t[nod]], sizeof (ap[t[nod]])); ++ap[nod][ch[nod - 1] - '0']; First[nod] == (++K); L[nod] = L[t[nod]] + 1; for (int i = 0; i < v[nod].size (); ++i) { fiu = v[nod][i]; if (!viz[fiu]) { t[fiu] = nod; dfs (fiu); } } } void rmq() { for(int i = 2; i <= K; ++i) Lg[i] = Lg[i >> 1] + 1; for(int i = 1; i <= K; ++i) Rmq[0][i] = i; for(int i = 1; (1 << i) < K; ++i) for(int j = 1; j <= K - (1 << i) + 1; ++j) { int l = 1 << (i - 1); Rmq[i][j] = Rmq[i-1][j]; if(L[Rmq[i-1][j + l]] < L[Rmq[i][j]]) Rmq[i][j] = Rmq[i-1][j + l]; } } int lca(int x, int y) { int diff, l, sol, sh; int a = First[x], b = First[y]; if(a > b) swap(a, b); diff = b - a + 1; l = Lg[diff]; sol = Rmq[l][a]; sh = diff - (1 << l); if(L[sol] > L[Rmq[l][a + sh]]) sol = Rmq[l][a + sh]; return H[sol]; } inline int comun (int x, int y) { if (x > n || y > n) { return x < y ? x : y; } else { return lca (x, y); } } int main () { freopen ("date.in", "r", stdin); int x, y, tip; scanf ("%d%d%s", &n, &m, ch); nr = n; for (int i = 1; i < n; ++i) { scanf ("%d%d", &x, &y); v[x].push_back (y); v[y].push_back (x); } dfs (1); rmq (); for (int i = 1; i <= m; ++i) { scanf ("%d", &tip); if (tip == 2) { ++nr; scanf ("%d %c", &x, &ch[nr - 1]); if (x > n) t[nr] = t[x]; else t[nr] = x; memcpy (ap[nr], ap[x], sizeof (ap[x])); ++ap[nr][ch[nr - 1] - '0']; }else if (tip == 1) { scanf ("%d%d", &x, &y); int tt = comun (x, y); int sol = 0; for (int j = 0; j < 26; ++j) { int aux = ap[x][i] - ap[t[tt]][x] + ap[y][i] - ap[tt][y]; if (aux & 1) ++sol; } printf ("%d\n", sol); } } return 0; }