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

//#pragma GCC target("avx,avx2")	
#include<bits/stdc++.h>
//#include<immintrin.h>
using namespace std;

template <typename T> void chmin(T&x,const T &y)
{
	if(x>y)x=y;
}
template <typename T> void chmax(T &x,const T &y)
{
	if(x<y)x=y;
}
typedef int64_t s64;
typedef uint64_t u64;
typedef uint32_t u32;
typedef pair<int,int> pii;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
#define rep0(i,l,r) for(int i=l;i<r;++i)
#define gc (c=getchar())
char readc()
{
	char c;
	while(isspace(gc));
	return c;
}
int read()
{
	char c;
	while(gc<'-');
	if(c=='-')
	{
		int x=gc-'0';
		while(gc>='0')x=x*10+c-'0';
		return -x;
	}
	int x=c-'0';
	while(gc>='0')x=x*10+c-'0';
	return x;
}
#undef gc

const int C=5,N=3e4+5;
s64 dp[C][N],sum[C][N],sum1[C][N];
int p[N];
vector<int>lk[N];

int main()
{
#ifdef kcz
	freopen("1.in","r",stdin);//freopen("1.out","w",stdout);
#endif
	rep(c,0,4)
	{
		dp[c][0]=1;
		rep(n,1,30000)
		rep(i,0,min(n-1,c))dp[c][n]+=dp[c-i][n-i-1];
	}
	int tt=read();
	while(tt--)
	{
		int n=read(),c=read(),q=read();
		rep(i,1,n)p[i]=read();
		per(i,n,1)
		{
			lk[i].clear();
			rep(j,0,c)
			{
				if(i+j<=n)lk[i].push_back(j);
				sort(lk[i].begin(),lk[i].end(),[&](int x,int y){return p[i+x]<p[i+y];});
			}
		}
		rep(i,1,n)
		{
			rep(j,0,c)
			{
				sum[j][i]=sum[j][i-1];
				rep(k,0,j)
				if(i+k<=n && p[i+k]<p[i])sum[j][i]+=dp[j-k][n-i-k];
				sum1[j][i]=sum[j][i]+dp[j][n-i];
			}
		}
		while(q--)
		{
			int query_i=read();
			s64 k;
			scanf("%lld",&k);
			if(k>dp[c][n])
			{
				puts("-1");
				continue;
			}
			int i=1,nc=c;
			while(i<=n)
			{
				int j=0;
				s64 now;
				while(1)
				{
					while(lk[i][j]>nc)++j;
					if(k<=(now=dp[nc-lk[i][j]][n-i-lk[i][j]]))break;
					k-=now;
					++j;
				}
				nc-=lk[i][j];
				int i1=i+lk[i][j];
				if(i1>=query_i)
				{
					printf("%d\n",p[i+i1-query_i]);
					break;
				}
				i=i1+1;
				i1=min(lower_bound(sum[nc]+i,sum[nc]+n,k+sum[nc][i-1])-sum[nc],
				lower_bound(sum1[nc]+i,sum1[nc]+n,k+sum[nc][i-1]-1,greater<s64>())-sum1[nc]);
				if(i1>query_i)
				{
					printf("%d\n",p[query_i]);
					break;
				}
				k-=sum[nc][i1-1]-sum[nc][i-1];
				i=i1;
			}
		}
	}	
}
 
/* stuff you should look for
	* int overflow, array bounds, uppercase/lowercase 
	* special cases (n=1?)
	* do smth instead of nothing and stay organized
	* WRITE STUFF DOWN
	* DON'T GET STUCK ON ONE APPROACH
*/
