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;
#define ll long long
const int maxn = 30005;
const int maxm = 240005;
int T, n, c, q, a[maxn];
inline ll C(int n, int m) {
	if(!m) return 1;
	if(n < m) return 0;
	ll res = 1;
	for(int i = 0; i < m; i++) res *= n - i;
	for(int i = 2; i <= m; i++) res /= i;
	return res;
}
inline ll calc(int len, int cs) {
	ll res = 0;
	for(int i = 0; i <= cs; i++) res += C(len - 1, i);
	return res;
}

int L[5][maxn], R[5][maxn];
struct data {
	int l, r; 
	ll w;
	data(int _l = 0, int _r = 0, ll _w = 0) { l = _l, r = _r, w = _w; }
};
data A[5][maxm];
ll sum[5][maxm];
data solve(int l, int cs, ll k) {
	int nL = L[cs][l], nR = R[cs][l];
	int pos = lower_bound(sum[cs] + nL, sum[cs] + nR + 1, sum[cs][nL - 1] + k) - sum[cs];
	return data(A[cs][pos].l, A[cs][pos].r, sum[cs][pos - 1] - sum[cs][nL - 1]);
}

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 j = 1; j <= c; j++) L[j][n] = R[j][n] = n * c, A[j][L[j][n]] = data(n, n, 1);
		static int bot[5], tot;
		for(int i = n - 1; i >= 1; i--) 
			for(int j = 1; j <= c; j++) {
				tot = 0;
				L[j][i] = L[j][i + 1];
				R[j][i] = R[j][i + 1];
				
				for(int k = 1; k <= j && i + k <= n; k++) bot[++tot] = i + k;
				sort(bot + 1, bot + tot + 1, [=] (int x, int y) -> bool { return a[x] < a[y]; });
				for(int k = tot; k >= 1; k--)
					if(a[bot[k]] < a[i]) A[j][--L[j][i]] = data(i, bot[k], calc(n - bot[k], j - bot[k] + i));
				for(int k = 1; k <= tot; k++)
					if(a[bot[k]] > a[i]) A[j][++R[j][i]] = data(i, bot[k], calc(n - bot[k], j - bot[k] + i));
			}
		for(int j = 1; j <= c; j++) {
			sum[j][L[j][1] - 1] = 0;
			for(int i = L[j][1]; i <= R[j][1]; i++) sum[j][i] = sum[j][i - 1] + A[j][i].w;
		}
			
		ll all = calc(n, c), x = 0;
		int y = 0;
		while(q--) {
			scanf("%d%lld", &y, &x);
			if(x > all) {
				puts("-1");
				continue;
			}
			int res = a[y], nowp = 1, nowc = c;
			while(x && nowc && nowp <= n) {
				data now = solve(nowp, nowc, x);
				if(now.l <= y && y <= now.r) {
					res = a[now.l + now.r - y];
					break;
				}
				x -= now.w;
				nowp = now.r + 1;
				nowc -= now.r - now.l;
			}
			printf("%d\n", res);
		}
	}
	return 0;
}