#include using namespace std; using ll = long long; #define fi first #define se second int dfs(vector> &g, vector &seen, vector &l, int v){ seen[v] = true; int res = l[v]; for(int nv : g[v]){ if(!seen[nv]) res = max(res, dfs(g, seen, l, nv)); else res = (int)2e9; } return res; } int main(){ int n; cin >> n; vector l(n); l[0] = 0; vector> g(n); for(int i = 1; i < n; i++){ cin >> l[i]; int a; cin >> a; g[i].push_back(a - 1); } vector lmax(n, -1); lmax[0] = 1; vector seen(n, false); for(int i = 1; i < n; i++){ seen.assign(n, false); lmax[i] = dfs(g, seen, l, i); } map level; for(int i = 0; i < n; i++) level[lmax[i]]++; vector kinds((int)1e9 + 1); kinds[1] = 1; for(int i = 2; i <= (int)1e9; i++){ kinds[i] = kinds[i - 1] + level[i]; } int q; cin >> q; while(q--){ int k, xy; cin >> k >> xy; if(k == 1) cout << kinds[xy] << endl; if(k == 2) cout << lmax[xy - 1] << endl; } return 0; }