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


// Problem: E. Strange Permutation
// Contest: Codeforces - Codeforces Round #694 (Div. 1)
// URL: https://codeforces.com/problemset/problem/1470/E
// Memory Limit: 256 MB
// Time Limit: 3000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;

#define int long long

typedef pair<int, int> pii;
const int N = 3e4 + 5;

int n, c, q, p[N];

struct Node {
	int w, l, r;
	bool operator < (const Node &rhs) const {
		w < rhs.w;
	}
};

int ql[5], qr[5]; 
Node dq[5][10 * N];

bool cmp(const Node &a, const Node &b) {
	return p[a.r] < p[b.r];
}

int C(int n, int m) {
	if (n <= 0) return m == 0;
	if (n < m) return 0;
	int res = 1;
	for (int i = n; i > n - m; --i) res *= i;
	for (int i = 1; i <= m; ++i) res /= i;
	return res;
}

int ways(int len, int c) {
	int res = 0;
	for (int i = 0; i <= c; ++i) res += C(len - 1, i);
	return res;
}

int sumw[5][5 * N], pre_cnt[5][N];

Node F(int start, int rest, int kth) {
	int s = pre_cnt[rest][start], l = s + 1, r = qr[rest] - ql[rest] + 1;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (sumw[rest][mid] - sumw[rest][s] >= kth) r = mid;
		else l = mid + 1;
	}
	return Node{ sumw[rest][l - 1] - sumw[rest][s], dq[rest][ql[rest] + l - 1].l, dq[rest][ql[rest] + l - 1].r };
}

void solve() {
	cin >> n >> c >> q;
	for (int i = 1; i <= n; ++i) cin >> p[i];
	for (int s = 1; s <= c; ++s) {
		ql[s] = 4 * N + 1, qr[s] = 4 * N; 
		dq[s][++qr[s]] = Node{ 1, n, n };
		for (int i = 1; i <= n; ++i) pre_cnt[s][i] = 0;
		for (int i = n - 1; i; --i) {
			int dl = 0, dr = 0;
			for (int j = 1; j <= min(s, n - i); ++j) {
				int w = ways(n - (i + j), s - j);
				if (p[i + j] < p[i]) dq[s][ql[s] - (++dl)] = Node{ w, i, i + j  }, ++pre_cnt[s][i + 1];
				else dq[s][qr[s] + (++dr)] = Node{ w, i, i + j };
			}
			if (dl) {
				sort(dq[s] + ql[s] - dl, dq[s] + ql[s], cmp);
				ql[s] -= dl;
			}
			if (dr) {
				sort(dq[s] + qr[s] + 1, dq[s] + qr[s] + dr + 1, cmp);
				qr[s] += dr;
			}
		}
		for (int i = 1; i <= n; ++i) pre_cnt[s][i] += pre_cnt[s][i - 1];
		for (int i = ql[s]; i <= qr[s]; ++i) sumw[s][i - ql[s] + 1] = sumw[s][i - ql[s]] + dq[s][i].w;
	}
	int tot = ways(n, c);
	while (q--) {
		int pos, rank; cin >> pos >> rank;
		if (rank > tot) {
			cout << -1 << endl;
			continue;
		}
		vector<pii> rev;
		int start = 1, rest = c;
		while (true) {
			Node u = F(start, rest, rank);
			rev.push_back(make_pair(u.l, u.r));
			rank -= u.w, rest -= (u.r - u.l), start = u.r + 1;
			if (start > n || !rest) break;
		}
		bool flag = false;
		for (int i = 0; i < rev.size(); ++i)
			if (rev[i].first <= pos && rev[i].second >= pos) {
				cout << p[rev[i].second - (pos - rev[i].first)] << endl;
				flag = true;
				break;
			}
		if (!flag) cout << p[pos] << endl;
	}
}

signed main() {
	ios::sync_with_stdio(false);
  	cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while (T--) solve();
	return 0;
}