#include #include #include #include #include using namespace std; vector V[200001]; char letter[200001]; int t[200001]; int euler[3*200001]; int nivel[3*200001]; int frec[200001][28]; bitset<200001> used; vector >op; int auxn; int rmq[3*200001][24]; int log[3*200001]; int f[3*200001]; void create_euler(int nod,int niv) { euler[++auxn] = nod; f[nod] = auxn; nivel[auxn] = niv; frec[nod][letter[nod]-'a']++; used[nod] = true; for(vector::iterator it = V[nod].begin(); it != V[nod].end(); it++) if(!used[*it]) { for(int i = 0; i <= 26; i++) frec[*it][i]+=frec[nod][i]; t[*it] = nod; create_euler(*it,niv+1); euler[++auxn] = nod; nivel[auxn] = niv; } } int LCA(int x, int y) { x = f[x],y = f[y]; if(x > y) swap(x,y); int l = log[y-x+1]; if(nivel[rmq[x][l]] < nivel[rmq[y - (1<>n>>m; for(int i = 1; i <= n; i++) { cin>>letter[i]; } int a,b,x; for(int i = 1; i < n; i++) { cin>>a>>b; V[a].push_back(b); V[b].push_back(a); } char c; for(int i = 1; i <= m; i++) { cin>>x; if(x == 1) { cin>>a>>b; op.push_back(make_pair(a,b)); } else { cin>>a>>c; V[a].push_back(++n); V[n].push_back(a); letter[n] = c; } } create_euler(1,0); int nn = n; n = auxn; for(int i=1;i<=n;i++) { rmq[i][0] = i; if(i>1) log[i] = 1+log[i>>1]; } for(int j=1;(1< >::iterator it = op.begin(); it != op.end(); it++) { int x = it->first; int y = it->second; afis(x, y); } /* for(int i = 1; i <=n ;i ++) { for(int j =0;j<=26;j++) cout<