CCCPaste

G. Shorten the Array

#include <bits/stdc++.h>
using namespace std;
#define ld long double
#define F first
#define S second
#define Lnode 2*node+1
#define Rnode 2*node+2
#define MID (l+r>>1)
#define el '\n'
#define coutf(x) for(auto v:(x)) cout<<v<<' '; cout<<el
#define coutp(x) for(auto v:(x)) cout<<v.F<<' '<<v.S<<el
#define cinl(x) for(auto &v:(x)) cin>>v;
#define all(x) x.begin(),x.end()
#define ll long long
#define sz(x) (int)x.size()
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define vi vector<ll>
using ull = unsigned long long;
const int N=32*200005;
int trie[N][2];
int cnt[N];
int nodecnt;

void prepare() {
trie[0][0]=trie[0][1]=-1;
cnt[0]=-1;
nodecnt=1;
}


ll insert(int n,int idx)
{
int node=0;
for (int i=30;i>=0;i--)
{
int bit=((n>>i)&1LL);
if (trie[node][bit]==-1)
{
trie[node][bit]=nodecnt;
trie[nodecnt][0]=trie[nodecnt][1]=-1;
cnt[nodecnt] = -1;
nodecnt++;
}
node=trie[node][bit];
cnt[node]=idx;
}
}


ll mx(ll n,ll k)
{

int node=0;
ll num=0;
for (int i=30;i>=0;i--)
{
int bit=((n>>i)&1LL);
if (trie[node][1^bit]!=-1)
{
num|=(1LL<<i);
node=trie[node][1^bit];
}
else if (trie[node][bit]!=-1)node=trie[node][bit];
else return -1;
if (num>=k)return cnt[node];

}

if (num>=k)
return cnt[node];
return -1;

}


void solve()
{
int n,k;
cin>>n>>k;
vector<ll>ar(n);
for (int i=0;i<n;i++)cin>>ar[i];
if (k==0)
{
cout<<1<<"\n";
return;
}
prepare();
insert(ar[0],0);
int ans=INT_MAX;
for (int i=1;i<n;i++)
{
int idx=mx(ar[i],k);


if (idx!=-1)ans=min(ans,i-idx+1);
insert(ar[i],i);
}

if (ans==INT_MAX)cout<<-1<<"\n";
else cout<<ans<<"\n";
}




int32_t main()
{
// #ifndef ONLINE_JUDGE
// freopen("in.txt", "r", stdin);
// //freopen("output.txt", "w", stdout);
// #endif


ios_base::sync_with_stdio(false);
cin.tie(NULL);
int tc = 1;
cin >> tc;
for (int i = 1; i <= tc; i++)solve();
return 0;
}
/*
*/