//#include #include #include using namespace std; typedef int var; #define fin cin #define fout cout #define mp make_pair #define pii pair #define MAXN 10005 #define SIGMA 26 //ifstream fin("date.in"); //ofstream fout("date.out"); var PARENT[MAXN], C[MAXN][SIGMA]; var BEG[MAXN]; vector G[MAXN]; vector QUERIES; bool VIZ[MAXN]; vector EULER(1), DEPTH(1); var D[MAXN]; var LOG[MAXN]; var RMQ[23][MAXN], SOL[23][MAXN]; void dfs(var node, var depth) { VIZ[node] = 1; BEG[node] = EULER.size(); RMQ[0][EULER.size()] = depth; SOL[0][EULER.size()] = node; EULER.push_back(node); DEPTH.push_back(depth); for(auto vec : G[node]) { if(!VIZ[vec]) { PARENT[vec] = node; for(var i=0; i n2) swap(n1, n2); var lg = LOG[n2-n1+1]; if(RMQ[lg][n1] < RMQ[lg][n2-(1<>n>>m; for(var i=1; i<=n; i++) { fin>>c; C[i][c-'a']++; } for(var i=1; i>a>>b; G[a].push_back(b); G[b].push_back(a); } while(m--) { fin>>type; if(type == 1) { fin>>a>>b; QUERIES.push_back(mp(a, b)); } else { fin>>a>>c; G[a].push_back(++n); G[n].push_back(a); C[n][c-'a'] ++; } } dfs(1, 0); build_log_table(EULER.size() + 1); build_rmq_table(EULER.size() - 1); for(auto query : QUERIES) { var a = query.first, b = query.second; var lc = lca(a, b); var sum = 0; for(var i=0; i