#include #include #include using namespace std; //ifstream fin("date.in"); #define MAX 100010 typedef vector :: iterator iter; vector G[MAX]; int dad[2 * MAX][19]; int fr[2 * MAX][26]; int viz[MAX]; char c[MAX]; int n, d[2 * MAX]; int aux[26]; void lipeste(int nod, int fiu, char val) { // cout << nod << " " << fiu << " " << val << "\n"; d[fiu] = d[nod] + 1; int i; dad[fiu][0] = nod; for(i = 0 ; i < 26 ; i++) fr[fiu][i] = fr[nod][i]; fr[fiu][val - 'a']++; for(i = 1 ; dad[dad[fiu][i - 1]][i - 1] ; i++) dad[fiu][i] = dad[dad[fiu][i - 1]][i - 1]; } void df(int nod) { viz[nod] = 1; for(iter it = G[nod].begin() ; it != G[nod].end() ; it++) { if(!viz[*it]) { lipeste(nod, *it, c[*it]); df(*it); } } } void af() { for(int i = 1 ; i <= n ; i++) { cout << i << "\n"; for(int j = 0 ; dad[i][j] ; j++) { cout << dad[i][j] << " "; } cout << "\n\n"; } } int lca(int a, int b) { if(d[a] < d[b]) { swap(a, b); } int x = d[a] - d[b]; for(int i = 0 ; x ; i++) { if(x & (1 << i)) { x -= (1 << i); a = dad[a][i]; } } if(a == b) return a; for(int i = 18 ; i >= 0 ; i--) { if(dad[a][i] != dad[b][i]) { a = dad[a][i]; b = dad[b][i]; } } return dad[a][0]; } int main() { int m, i, j, x, y; cin >> n >> m; for(i = 1; i <= n ; i++) cin >> c[i]; for(i = 1 ; i < n ; i++) { cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } dad[1][0] = 0; fr[1][c[1] - 'a']++; d[1] = 1; df(1); while(m--) { cin >> x; if(x == 2) { cin >> y >> c[0]; lipeste(y, ++n, c[0]); } else { int s = 0; cin >> x >> y; int l = lca(x, y); for(i = 0 ; i < 26 ; i++) { aux[i] = fr[x][i] + fr[y][i] - fr[l][i] - fr[dad[l][0]][i]; if(aux[i] % 2 == 1) s++; } cout << s << "\n"; } } // af(); // cout << "\n\n\n\n\n"; // cout << lca(1, 1); }