#include <bits/stdc++.h>
using namespace std;
namespace SGT {
int size[800000];
void update(int l, int r, int o, int p) {
  size[o]++;
  if (l == r)
    return;
  else {
    int m = ((l + r) >> 1);
    if (m >= p)
      update(l, m, o * 2, p);
    else
      update(m + 1, r, o * 2 + 1, p);
  }
}
int query(int l, int r, int o, int k) {
  if (l == r)
    return l;
  else {
    int m = ((l + r) >> 1);
    if (size[o * 2] >= k)
      return query(l, m, o * 2, k);
    else
      return query(m + 1, r, o * 2 + 1, k - size[o * 2]);
  }
}
}  // namespace SGT
struct Query {
  int k, d, id;
  Query() {}
  Query(int a, int b, int c) : k(a), d(b), id(c) {}
  bool operator<(const Query& b) const { return k < b.k; }
};
Query q[200005];
int ans[200005];
pair<int, int> num[200005];
int val[200005];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &val[i]);
    num[i] = pair<int, int>(-val[i], i);
  }
  sort(num + 1, num + n + 1);
  int m;
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    q[i] = Query(x, y, i);
  }
  sort(q + 1, q + m + 1);
  int r = 1;
  for (int i = 1; i <= n; i++) {
    SGT::update(1, n, 1, num[i].second);
    while (r <= m && q[r].k <= i) {
      ans[q[r].id] = SGT::query(1, n, 1, q[r].d);
      r++;
    }
  }
  for (int i = 1; i <= m; i++) printf("%d\n", val[ans[i]]);
  return 0;
}
