1
10 2 20
8 5 2 4 10 3 9 7 1 6
5 10
3 17
6 31
3 46
10 42
7 19
9 36
7 3
3 13
8 32
10 25
9 34
10 34
6 33
3 9
2 17
4 5
10 44
9 15
5 40
 1
47 1 47
40 45 19 10 44 33 47 12 2 46 16 23 3 14 21 28 31 42 22 18 35 38 24 25 36 32 4 34 5 20 37 39 6 9 1 7 29 8 17 27 30 11 13 41 15 43 26
39 25
41 24
32 30
10 6
30 13
24 35
41 17
31 31
9 44
21 8
43 23
8 5
29 13
8 4
47 20
22 10
37 27
17 39
43 23
14 42
46 19
43 24
30 31
24 35
31 13
31 32
20 9
3 2
20 9
14 7
7 3
21 36
32 30
47 19
11 43
6 2
31 31
26 12
47 20
2 1
40 24
16 40
45 21
36 28
36 28
17 38
30 31
 1
1 1 4
1
1 1
1 2
1 3
1 4
 1
10 1 1
10 4 6 5 7 9 8 1 3 2
6 10

3
2
7
10
6
7
7
7
5
1
6
6
1
9
4
4
4
1
1
3
 27
27
37
16
20
24
11
20
46
35
11
2
34
47
26
24
7
28
11
3
26
13
37
24
37
37
22
10
22
14
47
38
37
43
23
33
20
4
26
19
30
21
43
1
1
42
37
 1
-1
-1
-1
 9

#include <bits/stdc++.h>
using namespace std;
const int maxn = 40000;
const int p = 1e9 + 7;
const int inf = 1e9;
int t, n, c, qq;
int a[maxn];
struct node {
  int l, r;
  long long w;
  bool operator<(const node x) const { return a[r] > a[x.r]; }
} q[5][maxn * 10];
vector<node> L[5], pos[5];
long long C(int n, int m) {
  if (n - 1 <= 0) {
    return m == 0;
  }
  if (n - 1 < m) return 0;
  long long res = 1;
  for (int i = n - 1; i >= n - m; i--) res *= i;
  for (int i = m; i >= 1; i--) res /= i;
  return res;
}
long long ways(int m, int cc) {
  long long res = 0;
  for (int i = 0; i <= cc; i++) res += C(m, i);
  return res;
}
node F(int s, int d, long long k) {
  int l = pos[d][s].l, r = pos[d][s].r;
  int lb = l - 1;
  while (r - l > 1) {
    int mid = (l + r) >> 1;
    if (L[d][mid].w - L[d][lb].w >= k)
      r = mid;
    else
      l = mid;
  }
  if (L[d][l].w - L[d][lb].w >= k)
    return (node){L[d][l].l, L[d][l].r, L[d][l - 1].w - L[d][lb].w};
  return (node){L[d][r].l, L[d][r].r, L[d][r - 1].w - L[d][lb].w};
}
void pre_work() {
  for (int d = 1; d <= c; d++) {
    L[d].resize(3 * n * c + 10);
    pos[d].resize(2 * n);
    int l = n * c + 2, r = n * c + 2;
    L[d][r++] = (node){n, n, 1};
    pos[d][n] = (node){l, r, 0};
    for (int i = n - 1; i >= 1; i--) {
      vector<node> vecf, vecb;
      vecf.clear();
      vecb.clear();
      for (int j = 1; j <= min(d, n - i); j++) {
        int l = i, r = i + j;
        long long w = ways(n - r, d - (r - l));
        if (a[i + j] < a[i]) {
          vecf.push_back({l, r, w});
        } else {
          vecb.push_back({l, r, w});
        }
      }
      sort(vecf.begin(), vecf.end());
      sort(vecb.begin(), vecb.end());
      for (auto k : vecf) L[d][--l] = k;
      for (auto k : vecb) L[d][r++] = k;
      pos[d][i] = (node){l, r, 0};
    }
    for (int i = l; i < r; i++) L[d][i].w += L[d][i - 1].w;
  }
}
void init() {
  for (int d = 1; d <= 4; d++) {
    L[d].clear();
    pos[d].clear();
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> t;
  while (t--) {
    cin >> n >> c >> qq;
    init();
    for (int i = 1; i <= n; i++) cin >> a[i];
    pre_work();
    long long tot = ways(n, c);
    for (int i = 1; i <= qq; i++) {
      int x;
      long long k;
      cin >> x >> k;
      if (k > tot) {
        cout << "-1" << endl;
        continue;
      }
      int s = 1, d = c, ans = a[x];
      while (1) {
        node now = F(s, d, k);
        if (now.l <= x && x <= now.r) {
          ans = a[now.r - (x - now.l)];
          break;
        }
        s = now.r + 1;
        d -= (now.r - now.l);
        k -= now.w;
        if (s > n) break;
        if (d <= 0) break;
      }
      cout << ans << endl;
    }
  }
  return 0;
}
