// CREATED BY MASHIROYUKI
#include <bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#pragma GCC optimize("O3")
#define rep(i, x, n) for(int i = x; i <= n; i ++ )
#define downrep(i, x, n) for(int i = n; i >= x; i -- )
template<typename T> void debug(T x) {cout << "#debug: " << x << endl;}
template<typename T> void debug(T x, T y) {cout << "#debug: " << x << " " << y << endl;}
template<typename T>
void read(T &x){
x = 0;
char ch = getchar();
while(!isdigit(ch)) ch = getchar();
while(isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
}
typedef long long ll;
typedef double db;
const int mod = 1e9 + 7;
const int N=2e5+10;
struct Q{
int k,id;
};
vector<Q>q[N];
vector<int>g[N];
vector<int> rt;
int rkn[N],hson[N],sz[N],L[N],R[N],dep[N],ord[N],ans[N];
int dfn,tot,n,m;
set<int> S[N];
map<string,int> mp;
void dfs0(int u,int d) {
L[u]=++dfn;
rkn[dfn]=u;
dep[u]=d;
sz[u]=1;
for(auto v:g[u]) {
dfs0(v,d+1);
sz[u]+=sz[v];
if(!hson[u]||sz[v]>sz[hson[u]]) hson[u]=v;
}
R[u]=dfn;
}
void add(int v) {
int d=dep[v];
S[d].insert(ord[v]);
}
void del(int v) {
int d=dep[v];
if(S[d].size()) S[d].clear();
}
void dfs1(int u,bool keep) {
for(auto v:g[u]) if(v!=hson[u]) dfs1(v,0);
if(hson[u])dfs1(hson[u],1);
for(auto v:g[u]) if(v!=hson[u]) {
rep(i,L[v],R[v]) add(rkn[i]);
}
add(u);
for(auto qr:q[u]) {
ans[qr.id]=S[qr.k].size();
}
if(!keep) {
rep(i,L[u],R[u]) del(rkn[i]);
}
}
int get(string& x) {
if(mp.find(x)==mp.end()) mp[x]=++tot;
return mp[x];
}
void solve(){
read(n);
rep(i,1,n) {
string s;cin>>s;
int t;read(t);
ord[i]=get(s);
if(!t) rt.push_back(i);
else g[t].push_back(i);
}
for(auto u:rt)dfs0(u,1);
read(m);
rep(i,1,m) {
int u,d;
read(u),read(d);
q[u].push_back({d+dep[u],i}); //后面会继承重儿子的信息所以要转换成绝对关系
}
for(auto u:rt)dfs1(u,0);
rep(i,1,m)
printf("%d\n",ans[i]);
}
signed main()
{
//IO
solve();
return 0;
}
这是蒟蒻的代码,一开始N开1e5+10out of bound了,但是开到2e5就过了,不是最大1e5吗?