#include #include using namespace std; using namespace atcoder; #define emb emplace_back using ll = long long; class EulerTour{ int N,cnt; vector in,out; fenwick_tree B_v; void dfs(int p,vector> &G){ in[p] = cnt++; for(int nex:G[p]) dfs(nex,G); out[p] = cnt++; } public: EulerTour(vector> &G):N(G.size()),cnt(0),in(N),out(N),B_v(N*2){dfs(0,G);} void add(int p,ll num=1){B_v.add(in[p],num);B_v.add(out[p],-num);} ll query(int p){return B_v.sum(0,in[p]+1);} }; int main(){ cin.tie(0);ios::sync_with_stdio(false); //入力 int N;cin >> N; vector S(N); for(string &s:S) cin >> s; int Q;cin >> Q; vector T(Q),X(Q);vector C(Q);//Tはクエリのタイプ for(int i=0;i> T[i] >> X[i];X[i]--; if(T[i] == 1) cin >> C[i]; } //クエリ全処理後のTrie木をつくる vector> path(N,vector({0}));//各文字列の文字ごとのnodeのindex vector node({0}); vector> nex(1,vector(26,-1)); vector S2 = S; for(int i=0;i(26,-1)); } now_node = nex[now_node][z]; path[i].emplace_back(now_node); } } //ただの根付き木にする int V = node.size(); vector> G(V); for(int i=0;i