#include #include #include #include #include #include #include #include #include #include #include #include #include #define pb push_back #define mp make_pair #define sortvi(a) sort(a.begin(), a.end()) #define FOR(i, start, final) for (int i=start; i<=final; ++i) #define ROF(i, start, final) for (int i=start; i>=final; --i) //#define f cin#define g cout using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair < int, int> pi; typedef vector< int > vi; typedef vector< pair< int, int > > vpi; int nr[200005][28], N, M, x, nod1, nod2, RMQ[18][600002], F[600002], lg[600002], E[600002], L[600002], y, dad[200005], tip, cnt=0; vector < int > G[200002]; char s[200005], c; bitset < 200005 > viz; struct asd{ int x, y; }op[100005]; void dfs(int nod, int level) { L[nod]=level; E[++E[0]]=nod; F[nod]=E[0]; ++nr[nod][s[nod]-'a']; viz[nod]=1; vector ::iterator it=G[nod].begin(); for (; it!=G[nod].end(); ++it) if (!viz[*it]) { FOR(i,0,26) nr[*it][i]+=nr[nod][i]; dad[*it]=nod; dfs(*it, level+1); E[++E[0]]=nod; L[E[0]]=level; } } int LCA(int nod1, int nod2) { int st=F[nod1], dr=F[nod2]; if (st>dr) swap(st, dr); int Log=lg[dr-st+1], x=RMQ[Log][st], y=RMQ[Log][dr-(1<>N>>M>>(s+1); for (int i=1; i>x>>y, G[x].pb(y), G[y].pb(x); while (M--) { f>>tip; if (tip==1) ++cnt, f>>op[cnt].x>>op[cnt].y; else { ++N; f>>x>>c; s[N]=c; G[x].pb(N); G[N].pb(x); } } dfs(1, 0); RMQ[0][1]=E[1]; for (int i=2; i<=E[0]; ++i) lg[i]=lg[i/2]+1, RMQ[0][i]=E[i]; for (int i=1; (1<