#include using namespace std; #define rep(i,n) for (int i = 0; i< (n); ++i) #define repi(i, a, b) for (int i = (a); i < (b); ++i) #define all(x) (x).begin(), (x).end() #define fore(i, a) for(auto &i:a) using ll = long long; int main() { int n; cin >> n; vector lv(n, -1); vector> p; map M; vector>> G(n); rep(i, n-1){ int l, a; cin >> l >> a; a--; G[a].push_back({l, i+1}); p.push_back({l, 0}); } int q; cin >> q; vector> qs(q); rep(i, q){ int t, x; cin >> t >> x; if(t == 2)x--; else{ p.push_back({x, 1}); } qs[i] = {t, x}; } vector seen(n, false); seen[0] = true; priority_queue, vector>, greater>> pq; fore(to, G[0]){ pq.push(to); } int kind = 1; sort(all(p)); fore(pp, p){ if(pp.second == 1){ M[pp.first] = kind; continue; } int nlv = pp.first; while(!pq.empty() && pq.top().first <= nlv){ auto[_, nxt] = pq.top(); pq.pop(); if(seen[nxt])continue; seen[nxt] = true; lv[nxt] = nlv; kind++; fore(e, G[nxt]){ pq.push(e); } } } vector cp = lv; sort(all(cp)); rep(i, q){ auto[t, x] = qs[i]; if(t == 1){ cout << upper_bound(all(cp), x)-cp.begin() + 1 << endl; } else{ cout << lv[x] << endl; } } }