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;
long long way(int n, int c) {
  long long res = 1;
  if (n <= 1) return c == 0;
  if (n - 1 < c) return 0;
  for (int i = n - 1; i >= n - c; i--) {
    res *= i;
  }
  for (int i = 1; i <= c; i++) {
    res /= i;
  }
  return res;
}
long long ways(int n, int c) {
  long long res = 0;
  for (int i = 0; i <= c; i++) res += way(n, i);
  return res;
}
struct tnode {
  int l, r;
  long long w;
};
const int maxn = 3e4;
const int maxc = 4;
tnode f[maxc + 1][maxc * maxn * 2 + 10];
int ql[maxc + 1], qr[maxc + 1];
int sum[maxc + 1][maxn + 1];
long long sumw[maxc + 1][maxn * maxc + 5];
int n, c, q, a[maxn + 5];
bool cmp(tnode l, tnode r) { return a[l.r] < a[r.r]; }
tnode F(int st, int s, int k) {
  int i = sum[s][st];
  int l = i + 1, r = qr[s] - ql[s] + 2;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (sumw[s][mid] - sumw[s][i] >= k)
      r = mid;
    else
      l = mid + 1;
  }
  return tnode{f[s][ql[s] + l - 1].l, f[s][ql[s] + l - 1].r,
               sumw[s][l - 1] - sumw[s][i]};
}
inline long long read() {
  long long res = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') {
    res = (res << 1) + (res << 3) + c - '0';
    c = getchar();
  }
  return res;
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    n = read();
    c = read();
    q = read();
    for (int i = 1; i <= n; i++) a[i] = read();
    for (int s = 1; s <= c; s++) {
      ql[s] = maxc * maxn + 5;
      qr[s] = maxc * maxn + 4;
      for (int i = 1; i <= n; i++) sum[s][i] = 0;
      f[s][++qr[s]] = tnode{n, n, 1};
      for (int i = n - 1; i >= 1; i--) {
        int dl = 0, dr = 0;
        for (int j = 1; j <= min(s, n - i); j++) {
          long long w = ways(n - (i + j), s - j);
          if (a[i + j] < a[i]) {
            f[s][ql[s] - (++dl)] = tnode{i, i + j, w};
          } else
            f[s][qr[s] + (++dr)] = tnode{i, i + j, w};
        }
        if (dl) {
          sort(f[s] + ql[s] - dl, f[s] + ql[s], cmp);
          ql[s] -= dl;
        }
        if (dr) {
          sort(f[s] + qr[s] + 1, f[s] + qr[s] + dr + 1, cmp);
          qr[s] += dr;
        }
      }
      for (int i = 1; i <= n; i++) sum[s][i] += sum[s][i - 1];
      for (int i = ql[s]; i <= qr[s]; i++) {
        sumw[s][i - ql[s] + 1] += sumw[s][i - ql[s]] + f[s][i].w;
      }
    }
    long long lim = ways(n, c);
    while (q--) {
      int pos;
      long long k;
      pos = read();
      k = read();
      if (k > lim) {
        printf("-1\n");
        continue;
      }
      vector<pair<int, int> > revs;
      int p = 1, s = c;
      while (1) {
        tnode t = F(p, s, k);
        revs.push_back(make_pair(t.l, t.r));
        k -= t.w;
        s -= (t.r - t.l);
        p = t.r + 1;
        if (!s) break;
        if (p > n) break;
      }
      int bj = 0;
      for (int i = 0; i < revs.size(); i++) {
        if (revs[i].first <= pos && revs[i].second >= pos) {
          printf("%d\n", a[revs[i].second + revs[i].first - pos]);
          bj = 1;
          break;
        }
      }
      if (!bj) {
        printf("%d\n", a[pos]);
      }
    }
  }
  return 0;
}
