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 long long N = 3e5 + 1e3 + 7;
long long T, n, c, q;
long long p[N];
long long sl[N][5], sr[N][5];
long long ways[N][5];
long long C(long long n, long long m) {
  if (n < m || n < 0 || m < 0) return 0;
  __int128 ret = 1;
  for (long long i = 1; i <= m; i++) ret = ret * (n - i + 1) / i;
  return ret;
}
bool cmp(long long a, long long b) { return p[a] < p[b]; }
signed main() {
  scanf("%lld", &T);
  while (T--) {
    scanf("%lld%lld%lld", &n, &c, &q);
    for (long long i = 1; i <= n; i++) scanf("%lld", &p[i]);
    for (long long j = 0; j <= c; j++) ways[1][j] = ways[0][j] = 1;
    for (long long i = 2; i <= n; i++) {
      ways[i][0] = 1;
      for (long long j = 1; j <= c; j++)
        ways[i][j] = ways[i][j - 1] + C(i - 1, j);
    }
    for (long long i = 1; i <= n; i++) {
      for (long long t = 0; t <= c; t++) {
        sl[i][t] += sl[i - 1][t];
        sr[i][t] += sr[i - 1][t];
        for (long long j = i + 1; j - i <= t && j <= n; j++)
          if (p[j] < p[i])
            sl[i][t] += ways[n - j][t - (j - i)];
          else
            sr[i][t] += ways[n - j][t - (j - i)];
      }
    }
    while (q--) {
      long long x, y;
      scanf("%lld%lld", &x, &y);
      if (y > ways[n][c]) {
        puts("-1");
        continue;
      }
      long long pos = 1, rm = c;
      while (pos <= n) {
        assert(rm >= 0);
        if (!rm) {
          printf("%lld\n", p[x]);
          break;
        }
        long long l = pos - 1, r = n + 1;
        while (r - l > 1) {
          long long mid = (l + r) >> 1;
          if (y <= sl[mid][rm] - sl[pos - 1][rm] ||
              y >= ways[n - pos + 1][rm] - (sr[mid][rm] - sr[pos - 1][rm]) + 1)
            r = mid;
          else
            l = mid;
        }
        if (x < r) {
          printf("%lld\n", p[x]);
          break;
        }
        y -= sl[r - 1][rm] - sl[pos - 1][rm];
        pos = r;
        vector<long long> v;
        for (long long i = pos; i - pos <= rm && i <= n; i++) v.push_back(i);
        sort(v.begin(), v.end(), cmp);
        long long pl = -1, pr = -1;
        long long sum = 0;
        for (auto x : v)
          if (x != pos) sum += ways[n - x][rm - (x - pos)];
        for (auto x : v) {
          if (y <= ways[n - x][rm - (x - pos)]) {
            pl = pos, pr = x;
            break;
          }
          y -= ways[n - x][rm - (x - pos)];
        }
        if (pl == pr) {
          puts("GG");
          return 0;
        }
        if (pl <= x && x <= pr) {
          printf("%lld\n", p[pl + pr - x]);
          break;
        }
        pos = pr + 1;
        rm -= (pr - pl);
      }
    }
  }
}
