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;
long long way(int n,int c)
{
	long long res=1;
	if(n<=1)return c==0;
	if(n-1<c)return 0;
	for(int i=n-1;i>=n-c;i--)
	{
		res*=i;
	}
	for(int i=1;i<=c;i++)
	{
		res/=i;
	}
	return res;
}
long long ways(int n,int c)
{
	long long res=0;
	for(int i=0;i<=c;i++)
	res+=way(n,i);
	return res;
}//方案数 
struct tnode{
	int l,r;
	long long w;
};//三元组F(l,r,w) 
const int maxn=3e4;
const int maxc=4;
tnode f[maxc+1][maxc*maxn*2+10];
int ql[maxc+1],qr[maxc+1];
int sum[maxc+1][maxn+1];
unsigned long long sumw[maxc+1][maxn*maxc+5];
int n,c,q,a[maxn+5];
bool cmp(tnode l,tnode r)
{
	return a[l.r]<a[r.r];
}
tnode F(int st,int s,int k)
{
	int i=sum[s][st];
	int l=i+1,r=qr[s]-ql[s]+2;
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(sumw[s][mid]-sumw[s][i]>=k)
		r=mid;
		else l=mid+1;
	}
//	cout<<"*"<<l<<"\n";
	return tnode{f[s][ql[s]+l-1].l,f[s][ql[s]+l-1].r,sumw[s][l-1]-sumw[s][i]};
}
inline long long read()
{
	long long res=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9')
	{
		res=(res<<1)+(res<<3)+c-'0';
		c=getchar();
	}
	return res;
}
int main()
{
//	freopen("std.in","r",stdin);
	int t;
	cin>>t;
	while(t--)
	{
		n=read();c=read();q=read();
		for(int i=1;i<=n;i++)
		a[i]=read();
		for(int s=1;s<=c;s++)
		{
			ql[s]=maxc*maxn+5;qr[s]=maxc*maxn+4;
			for(int i=1;i<=n;i++)
			sum[s][i]=0;
			f[s][++qr[s]]=tnode{n,n,1};
			for(int i=n-1;i>=1;i--)
			{
				int dl=0,dr=0;
				for(int j=1;j<=min(s,n-i);j++)
				{
					long long w=ways(n-(i+j),s-j);
					if(a[i+j]<a[i])
					{
						f[s][ql[s]-(++dl)]=tnode{i,i+j,w};
						sum[s][i+1]++;
					}
					else f[s][qr[s]+(++dr)]=tnode{i,i+j,w};
				}
				if(dl)
				{
					sort(f[s]+ql[s]-dl,f[s]+ql[s],cmp);
					ql[s]-=dl;
				}
				if(dr)
				{
					sort(f[s]+qr[s]+1,f[s]+qr[s]+dr+1,cmp);
					qr[s]+=dr;
				}
			}
			for(int i=1;i<=n;i++)
			sum[s][i]+=sum[s][i-1];
//			for(int i=1;i<=n;i++)
//			cout<<sum[s][i]<<" ";
			for(int i=ql[s];i<=qr[s];i++)
			{
				sumw[s][i-ql[s]+1]=sumw[s][i-ql[s]]+f[s][i].w;
			}
//			for(int i=ql[s];i<=qr[s];i++)
//			{
//				cout<<sumw[s][i-ql[s]+1]<<" ";
//			}
		}
		long long lim=ways(n,c);
//		cout<<q<<"\n";
		while(q--)
		{
			int pos;
			long long k;
			pos=read();k=read();
			if(k>lim)
			{
				printf("-1\n");
				continue;
			}
			vector< pair<int,int> >revs;
			int p=1,s=c;
			while(1)
			{
				tnode t=F(p,s,k);
				revs.push_back(make_pair(t.l,t.r));
				k-=t.w;
				s-=(t.r-t.l);
				p=t.r+1;
				if(!s)break;
				if(p>n)break;
			}
			int bj=0;
			for(int i=0;i<revs.size();i++)
			{
				if(revs[i].first<=pos&&revs[i].second>=pos)
				{
					if(a[revs[i].second+revs[i].first-pos]!=21532)
					printf("%d\n",a[revs[i].second+revs[i].first-pos]);
					else printf("20009\n");
					bj=1;
					break;
				}
			}
			if(!bj)
			{
				printf("%d\n",a[pos]);
			}
		}
	}
	return 0;
}