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

//#define _GLIBCXX_DEBUG

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

#define endl '\n'
#define lfs cout<<fixed<<setprecision(10)
#define ALL(a)  (a).begin(),(a).end()
#define ALLR(a)  (a).rbegin(),(a).rend()
#define spa << " " <<
#define fi first
#define se second
#define MP make_pair
#define MT make_tuple
#define PB push_back
#define EB emplace_back
#define rep(i,n,m) for(ll i = (n); i < (ll)(m); i++)
#define rrep(i,n,m) for(ll i = (ll)(m) - 1; i >= (ll)(n); i--)
using ll = long long;
using ld = long double;
const ll MOD1 = 1e9+7;
const ll MOD9 = 998244353;
const ll INF = 1e18;
using P = pair<ll, ll>;
template<typename T1, typename T2>bool chmin(T1 &a,T2 b){if(a>b){a=b;return true;}else return false;}
template<typename T1, typename T2>bool chmax(T1 &a,T2 b){if(a<b){a=b;return true;}else return false;}
ll median(ll a,ll b, ll c){return a+b+c-max({a,b,c})-min({a,b,c});}
void ans1(bool x){if(x) cout<<"Yes"<<endl;else cout<<"No"<<endl;}
void ans2(bool x){if(x) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
void ans3(bool x){if(x) cout<<"Yay!"<<endl;else cout<<":("<<endl;}
template<typename T1,typename T2>void ans(bool x,T1 y,T2 z){if(x)cout<<y<<endl;else cout<<z<<endl;}  
template<typename T>void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++){cout<<v[i][0];for(ll j=1;j<w;j++)cout spa v[i][j];cout<<endl;}};
void debug(vector<string>&v,ll h,ll w){for(ll i=0;i<h;i++){for(ll j=0;j<w;j++)cout<<v[i][j];cout<<endl;}};
template<typename T>void debug(vector<T>&v,ll n){if(n!=0)cout<<v[0];for(ll i=1;i<n;i++)cout spa v[i];cout<<endl;};
template<typename T>vector<vector<T>>vec(ll x, ll y, T w){vector<vector<T>>v(x,vector<T>(y,w));return v;}
ll gcd(ll x,ll y){ll r;while(y!=0&&(r=x%y)!=0){x=y;y=r;}return y==0?x:y;}
vector<ll>dx={1,-1,0,0,1,1,-1,-1};vector<ll>dy={0,0,1,-1,1,-1,1,-1};
template<typename T>vector<T> make_v(size_t a,T b){return vector<T>(a,b);}
template<typename... Ts>auto make_v(size_t a,Ts... ts){return vector<decltype(make_v(ts...))>(a,make_v(ts...));}
template<typename T1, typename T2>ostream &operator<<(ostream &os, const pair<T1, T2>&p){return os << p.first << " " << p.second;}
template<typename T>ostream &operator<<(ostream &os, const vector<T> &v){for(auto &z:v)os << z << " ";cout<<"|"; return os;}
template<typename T>void rearrange(vector<ll>&ord, vector<T>&v){
  auto tmp = v;
  for(int i=0;i<tmp.size();i++)v[i] = tmp[ord[i]];
}
template<typename Head, typename... Tail>void rearrange(vector<ll>&ord,Head&& head, Tail&&... tail){
  rearrange(ord, head);
  rearrange(ord, tail...);
}
//mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
int popcount(ll x){return __builtin_popcountll(x);};
int poplow(ll x){return __builtin_ctzll(x);};
int pophigh(ll x){return 63 - __builtin_clzll(x);};

int main(){
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  ll res=0,buf=0;
  bool judge = true;
  ll t;cin>>t;
  while(t--){
    ll n,c,q;cin>>n>>c>>q;
    vector<ll>p(n);
    rep(i,0,n)cin>>p[i];
    auto dp=vec(n+1,c+1,0LL);
    //区間長iに対するコストj以下の操作方法の数
    dp[0][0]=1;
    rep(i,0,n){
      rep(j,0,c+1){
        rep(o,j,c+1){
          if(i+(o-j)+1<=n)dp[i+(o-j)+1][o]+=dp[i][j];
        }
      }
    }
    rep(i,0,n+1)rep(j,0,c)dp[i][j+1]+=dp[i][j];
    auto dpm=vec(n,c+1,0LL);
    //位置iで残りコストjで操作しなかった場合に飛ばされる順列の数
    rep(i,0,n)rep(j,0,c+1){
      rep(o,1,j+1){
        if(i+o>=n)continue;
        if(p[i]>p[i+o])dpm[i][j]+=dp[n-(i+o+1)][j-o];
      }
    }
    auto dpmc=vec(c+1,n+1,0LL);
    rep(i,0,n)rep(j,0,c+1){
      dpmc[j][i+1]=dpmc[j][i]+dpm[i][j];
    }
    while(q--){
      ll x,y;cin>>x>>y;x--;
      ll idx=0,rem=c;
      while(1){
        ll r=lower_bound(ALL(dpmc[rem]),dpmc[rem][idx]+y)-dpmc[rem].begin();
        //cout<<idx spa r<<endl;
        if(r==n+1){
          y-=dpmc[rem][n];
          if(y<=dp[n-idx-1][rem]){
            cout<<p[x]<<endl;
            break;
          }
          y-=dp[n-idx-1][rem];
          vector<ll>ord;
          rep(i,1,rem+1){
            if(idx+i>=n)continue;
            if(p[idx]<p[idx+i]){
              ord.PB(i);
            }
          }
          sort(ALL(ord),[&](ll i,ll j){return p[idx+i]<p[idx+j];});
          bool br=false;
          rep(tmp,0,ord.size()){
            ll i=ord[tmp];
            ll pt=dp[n-idx-i-1][rem-i];
            //cout<<i spa pt spa y<<endl;
            if(y<=pt){
              rem-=i;
              if(x<=idx+i){
                //cout<<x spa idx spa i<<endl;
                cout<<p[idx+i-(x-idx)]<<endl;
                br=true;
                break;
              }
              idx+=i+1;
            }
            if(tmp+1==ord.size()){
              cout<<-1<<endl;
              br=true;
              break;
            }
          }
          if(br)break;
        }
        else if(r-1>x){
          cout<<p[x]<<endl;
          break;
        }
        else{
          idx=r;
          vector<ll>ord;
          rep(i,1,rem+1){
            if(idx+i>=n)continue;
            if(p[idx]>p[idx+i]){
              ord.PB(i);
            }
          }
          sort(ALL(ord),[&](ll i,ll j){return p[idx+i]<p[idx+j];});
          bool br=false;
          rep(tmp,0,ord.size()){
            ll i=ord[tmp];
            ll pt=dp[n-idx-i-1][rem-i];
            if(y<=pt){
              rem-=i;
              if(x<=idx+i){
                cout<<p[idx+i-(x-idx)]<<endl;
                br=true;
                break;
              }
              idx+=i+1;
            }
            if(tmp+1==ord.size()){
              cout<<-1<<endl;
              br=true;
              break;
            }
          }
          if(br)break;
        }
      }
    }
  }
  return 0;
}