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 std::sort; using std::vector; using std::min; using std::lower_bound;
typedef long long LL;
const int N = 30005, SZ = N * 5;
int T, n, c, Q, a[N]; LL w[N][5];
LL C(int n, int m) {
	LL res = 1;
	for (int i = n; i > n - m; i--)
		res = res * i / (n - i + 1);
	return res;
}
struct Node { int l, r; LL w; };
struct Queue {
	Node a[SZ]; int l, r;
	void clr() { l = r = 0; }
	void B(Node x) { a[r++] = x; r %= SZ; }
	void F(Node x) { if (!l) l = SZ; a[--l] = x; }
} q[5];
int ql[N][5], qr[N][5];
vector<LL> val[5];
int main() {
	scanf("%d", &T);
	while (T--) {
		scanf("%d%d%d", &n, &c, &Q);
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);
		for (int i = 1; i <= c; i++)
			val[i].clear(), q[i].clr(), q[i].B({0, 0, 1});
		for (int i = 0; i <= n; i++) {
			w[i][0] = 1;
			for (int j = 1; j <= c; j++)
				w[i][j] = w[i][j - 1] + (i ? C(i - 1, j) : 0);
		}
		for (int i = n; i; i--) {
			int m = min(c, n - i), b[m + 1];
			for (int j = 1; j <= m; j++) b[j] = j;
			sort(b + 1, b + m + 1, [&](int x, int y) { return a[i + x] < a[i + y]; });
			for (int j = m; j; j--)
				if (a[i + b[j]] < a[i])
					for (int k = b[j]; k <= c; k++)
						q[k].F({i, i + b[j], w[n - (i + b[j])][k - b[j]]});
			for (int j = 1; j <= m; j++)
				if (a[i + b[j]] > a[i])
					for (int k = b[j]; k <= c; k++)
						q[k].B({i, i + b[j], w[n - (i + b[j])][k - b[j]]});
			for (int j = 1; j <= c; j++)
				ql[i][j] = q[j].l, qr[i][j] = q[j].r;
		}
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= c; j++)
				ql[i][j] = (ql[i][j] - q[j].l + SZ) % SZ, qr[i][j] = (qr[i][j] - q[j].l + SZ) % SZ;
		for (int i = 1; i <= c; i++) {
			for (int j = q[i].l; j != q[i].r; j = (j + 1) % SZ)
				val[i].push_back((val[i].size() ? val[i][val[i].size() - 1] : 0) + q[i].a[j].w);
		}
		while (Q--) {
			int x; LL y; scanf("%d%lld", &x, &y);
			if (w[n][c] < y) { puts("-1"); continue; }
			int i = c, now = 1;
			for (;;) {
			    if (!i) { printf("%d\n", a[x]); break; }
				LL y0 = ql[now][i] ? val[i][ql[now][i] - 1] : 0;
				int pos = lower_bound(val[i].begin() + ql[now][i], val[i].begin() + qr[now][i], y + y0) - val[i].begin();
				Node tmp = q[i].a[(q[i].l + pos) % SZ];
				if (!tmp.l || x <= tmp.r) {
					printf("%d\n", !tmp.l || x < tmp.l ? a[x] : a[tmp.r - x + tmp.l]);
					break;
				}
				y -= val[i][pos] - y0 - w[n - tmp.r][i - (tmp.r - tmp.l)], i -= tmp.r - tmp.l, now = tmp.r + 1;
			}
		}
	}
	return 0;
}