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;
void read(long long &x) {
  char ch = getchar();
  x = 0;
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
}
const long long N = 5e4 + 5, M = 5;
long long C(long long x, long long y) {
  if (x < 1) return (y == 0);
  if (x < y) return 0;
  long long s = 1;
  for (long long i = 0; i < y; ++i) s *= (x - i);
  for (long long i = 2; i <= y; ++i) s /= i;
  return s;
}
long long ways(long long len, long long c) {
  long long s = 0;
  for (long long i = 0; i <= c; ++i) s += C(len - 1, i);
  return s;
}
long long n, c, Q, a[N], L[5], R[5], ll[5][N], rr[5][N], s[5][N * M * 2];
struct node {
  long long l, r, w;
  void set(long long L, long long R, long long p) {
    l = L, r = R, w = ways(n - r, p - (r - l));
  }
} q[5][N * M * 2];
void prework() {
  for (long long i = 1; i <= c; ++i)
    L[i] = n * c, R[i] = L[i], q[i][R[i]] = {0, 0, 1};
  L[0] = R[0] = 1, q[0][1] = {0, 0, 1};
  for (long long i = n; i >= 1; --i) {
    ll[0][i] = rr[0][i] = 1;
    for (long long j = 1; j <= c; ++j) {
      for (long long k = 1; k <= j && i + k <= n; ++k) {
        long long l = i, r = i + k;
        if (a[r] < a[l])
          --L[j], q[j][L[j]].set(l, r, j);
        else
          ++R[j], q[j][R[j]].set(l, r, j);
      }
      ll[j][i] = L[j], rr[j][i] = R[j];
    }
  }
  for (long long i = 1; i <= c; ++i)
    for (long long j = L[i]; j <= R[i]; ++j) s[i][j] = s[i][j - 1] + q[i][j].w;
}
long long sum(long long c, long long l, long long r) {
  return s[c][r] - s[c][l - 1];
}
node get(long long x, long long c, long long k) {
  long long l = ll[c][x], r = rr[c][x], mid, res;
  while (l <= r) {
    mid = l + r >> 1;
    if (sum(c, ll[c][x], mid) >= k)
      res = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  return q[c][res];
}
signed main() {
  long long T;
  read(T);
  while (T--) {
    read(n), read(c), read(Q);
    for (long long i = 1; i <= n; ++i) read(a[i]);
    long long x = 0, y = 0, now, cnt, res;
    prework();
    while (Q--) {
      read(y), read(x);
      now = 1, cnt = c, res = a[y];
      if (ways(n, c) < x) {
        puts("-1");
        continue;
      }
      while (x && cnt) {
        node tmp = get(now, cnt, x);
        if (tmp.l <= y && tmp.r >= y) {
          res = a[tmp.l + tmp.r - y];
          break;
        }
        now = tmp.r + 1, cnt -= (tmp.r - tmp.l), x -= tmp.w;
      }
      printf("%lld\n", res);
    }
  }
  return 0;
}
