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;

typedef long long ll;

int main() {
	int t;
	cin >> t;
	
	while (t--) {
		int n, c, q;
		scanf("%d %d %d", &n, &c, &q);
		
		vector<int> p(n + 1);
		for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
		
		vector<vector<ll>> tot(n + 2, vector<ll>(c + 1, 1));
		vector<vector<vector<ll>>> dp(n + 1, vector<vector<ll>>(c + 1, {0, 0}));
		
		for (int i = n; i >= 1; i--) {
			for (int _c = 0; _c <= c; _c++) {
				tot[i][_c] = tot[i + 1][_c];
				for (int len = 1; len <= _c && i + len <= n; len++) {
					tot[i][_c] += tot[i + len + 1][_c - len];
				}
			}
		}
		
		for (int i = n - 1; i >= 1; i--) {
			for (int _c = 0; _c <= c; _c++) {
				dp[i][_c] = dp[i + 1][_c];
				for (int len = 1; len <= _c && i + len <= n; len++) {
					int d = p[i] < p[i + len];
					dp[i][_c][d] += tot[i + len + 1][_c - len];
				}
			}
		}
		
		while (q--) {
			int pos;
			ll rank;
			scanf("%d %lld", &pos, &rank);
			
			if (tot[1][c] < rank) {
				puts("-1");
				continue;
			}
			
			int at = 1;
			int _c = c;
			
			while (true) {
				assert(at <= pos);
				int d = dp[at][_c][0] < rank - 1;
				ll diff = abs(dp[at][_c][0] - (rank - 1));
				int L = at, R = n + 1;
				while (L != R) {
					int mid = (L + R + 1) / 2;
					if (mid > n || dp[mid][_c][d] >= diff) L = mid;
					else R = mid - 1;
				}
				
				int to = L;
				// debug() << name(at) name(to) name(rank) name(diff) name(tot[at][_c]) name(dp[at][_c][0]);
				if (pos < to) {
					printf("%d\n", p[pos]);
					break;
				} else {
					assert(to < n);
					vector<pair<int, ll>> v{{0, dp[to + 1][_c][d]}};
					for (int len = 1; len <= _c && to + len <= n; len++) {
						if ((p[to] < p[to + len]) == d) {
							v.push_back({len, tot[to + len + 1][_c - len]});
						}
					}
					sort(v.begin(), v.end(), [&p, to, d](const pair<int, ll>& p1, const pair<int, ll>& p2) {
						return (p[to + p1.first] < p[to + p2.first]) == d;
					});
					// debug() << name(v);
					int len;
					ll poss;
					for (int i = 0; ; i++) {
						assert(i < v.size());
						if (diff <= v[i].second) {
							len = v[i].first;
							poss = v[i].second;
							break;
						}
						diff -= v[i].second;
					}
					
					_c -= len;
					if (pos <= to + len) {
						int _pos = to + len - (pos - to);
						printf("%d\n", p[_pos]);
						break;
					}
					at = to + len + 1;
					rank = d == 1 ? diff : poss + 1 - diff;
				}
			}
		}
	}
	
	return 0;
}