codeforces
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define endl '\n'
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f3f3f3f,N=2e5+10;
int a[N];
int p[N][30];//p[i][j]表示前i个数中 所有数的二进制表示中第j位为1的个数
//一个常见的结论,以某个点为左端点的区间中区间与的值只会在O(logn)个位置发生改变,枚举一下会发生改变的位置即可.
// & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
// & 运算 都为1时为1 要求越来越严格 运算次数越多越小 越&越小
// | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
// | 运算 只要有1就为1 要求越来越不严格 运算次数越多越大 越|越大
void solve()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<30;j++)
{
if(a[i]&(1<<j))//如果a[i]的二进制表示中的第j位是1
{
p[i+1][j]=p[i][j]+1;
}
else
{
p[i+1][j]=p[i][j];
}
}
}
auto cal=[&](int l,int r)
{
int ans=0;
for(int i=0;i<30;i++)
{
if(p[r][i]-p[l-1][i]==r-l+1)ans+=(1<<i);//a[l1,mid]的每个数的第j位都为1
}
return ans;
};
int q;
cin>>q;
while(q--)
{
int l,k;
cin>>l>>k;
if(a[l-1]<k)
{
cout<<"-1"<<" \n"[q==0];continue;
}
int ll=l,rr=n;
while(ll<rr)
{
int mid=ll+rr+1>>1;
int res=cal(l,mid);
if(res>=k)ll=mid;
else rr=mid-1;
}
cout<<ll<<" \n"[q==0];
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}