#include using namespace std; using ll = long long; using pll = pair; #define drep(i, cc, n) for (ll i = (cc); i <= (n); ++i) #define rep(i, n) drep(i, 0, n - 1) #define all(a) (a).begin(), (a).end() #define pb push_back #define fi first #define se second mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count()); const ll MOD1000000007 = 1000000007; const ll MOD998244353 = 998244353; const ll MOD[3] = {999727999, 1070777777, 1000000007}; const ll LINF = 1LL << 60; const int IINF = 1 << 30 - 1; template struct Edge{ int to; T w; Edge(int to_, T w_=1){ to = to_; w=w_; } }; template using Tree = vector>>; template using Graph = vector>>; /* 容量&重み付きエッジ for Dinic */ template struct REdge{ int to; T cap; T cost; int rev; REdge(int to_, T cap_, T cost_=1){ to = to_; cap = cap_; cost = cost_; } REdge(int to_, T cap_, T cost_, int rev_){ to = to_; cap = cap_; cost = cost_; rev = rev_; } }; /* 残余グラフ for Dinic */ template using RGraph = vector>>; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); ll n; cin >> n; vector l(n), a(n); for(ll i=1; i> l[i] >> a[i]; a[i]--; } Graph G(n); for(ll i=1; i(i)); vector min_l(n, LINF); min_l[0] = 0; priority_queue, greater> PQ; PQ.push({0, 0}); while(!PQ.empty()){ ll v = PQ.top().se; ll tmp_min_l = PQ.top().fi; PQ.pop(); if(min_l[v] < tmp_min_l) continue; for(Edge e : G[v]){ if(max(min_l[v], l[e.to]) < min_l[e.to]){ min_l[e.to] = max(min_l[v], l[e.to]); PQ.push({min_l[e.to], e.to}); } } } vector kind(n); rep(i, n) kind[i] = min_l[i]; sort(all(kind)); ll q; cin >> q; while(q--){ ll t, x; cin >> t >> x; if(t==1){ cout << upper_bound(all(kind), x)-kind.begin() << '\n'; }else{ if(min_l[x-1]==LINF) cout << -1 << '\n'; else cout << min_l[x-1] << '\n'; } } }