#include using namespace std; struct Doubling { int nb; vector> d; Doubling(const vector& xs, int nb = 60) : nb(nb) { int n = xs.size(); d.assign(nb, vector(n)); for (int i = 0; i < n; i++) d[0][i] = xs[i]; for (int k = 0; k < nb - 1; k++) { for (int i = 0; i < n; i++) { d[k + 1][i] = d[k][d[k][i]]; } } } int query(long long k, int start) { int cur = start; for (int i = 0; i < nb; i++) { if (k & (1LL << i)) { cur = d[i][cur]; } } return cur; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector H(N), T(N); for (int i = 0; i < N; i++) cin >> H[i]; for (int i = 0; i < N; i++) cin >> T[i]; int Q; cin >> Q; vector> cities; for (int i = 0; i < N; i++) { cities.emplace_back(H[i], T[i], i); } sort(cities.begin(), cities.end()); vector> acc(N); for (int i = 0; i < N; i++) { auto [h, t, idx] = cities[i]; if (i == 0) acc[i] = {t, idx}; else acc[i] = max(acc[i-1], make_pair(t, idx)); } vector nexts; for (int i = 0; i < N; i++) { int p = upper_bound(cities.begin(), cities.end(), make_tuple(T[i], INT_MAX, INT_MAX)) - cities.begin(); if (p == 0) { nexts.push_back(i); } else { auto [t, ci] = acc[p-1]; if (t > T[i]) nexts.push_back(ci); else nexts.push_back(i); } } Doubling d(nexts); while (Q--) { int A, B; cin >> A >> B; A--; B--; long long k = (long long)1e16; int ci = d.query(k, A); if (H[B] > T[ci]) { cout << -1 << '\n'; continue; } long long lo = 0, hi = k, res = k; while (lo <= hi) { long long m = (lo + hi) / 2; int ci2 = d.query(m, A); if (T[ci2] >= H[B]) { res = min(res, m); hi = m - 1; } else { lo = m + 1; } } cout << res + 1 << '\n'; } return 0; }