#include <bits/stdc++.h>
using namespace std;
struct Q {
  int k, v;
} A[200010];
int cmp(Q a, Q b) {
  if (a.v == b.v) return a.k < b.k;
  return a.v > b.v;
}
struct P {
  int id, k;
};
vector<P> g[200010];
int T[1000000], ans[1000010], B[1000010];
void update(int root, int l, int r, int k, int v) {
  if (l == r) {
    T[root] += v;
    return;
  }
  int mid = (l + r) / 2;
  if (k <= mid)
    update(root * 2, l, mid, k, v);
  else
    update(root * 2 + 1, mid + 1, r, k, v);
  T[root] = T[root * 2] + T[root * 2 + 1];
}
int q(int root, int l, int r, int k) {
  if (l == r) return l;
  int mid = (l + r) / 2;
  if (k <= T[root * 2])
    return q(root * 2, l, mid, k);
  else
    return q(root * 2 + 1, mid + 1, r, k - T[root * 2]);
}
int main() {
  int a, i, j, n, m;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d", &B[i]);
    A[i].v = B[i];
    A[i].k = i;
  }
  sort(A + 1, A + 1 + n, cmp);
  P x;
  scanf("%d", &m);
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &a, &x.k);
    x.id = i;
    g[a].push_back(x);
  }
  for (i = 1; i <= n; i++) {
    update(1, 1, n, A[i].k, 1);
    for (j = 0; j < g[i].size(); j++) {
      x = g[i][j];
      ans[x.id] = q(1, 1, n, x.k);
    }
  }
  for (i = 1; i <= m; i++) printf("%d\n", B[ans[i]]);
  return 0;
}
