//预处理dist[]存每个值到mod的最小步数;因为宽搜有最短性质;
//倒着处理,
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=33000,mod=32768;
int n;
long long dist[N];
long long q[N];
long long ans[N];
void bfs()
{
int hh=0,tt=0;
q[0]=mod;
memset(dist,-1,sizeof dist);
dist[mod]=0;
while(hh<=tt)
{
int t=q[hh++];
// 顺着处理时: t=(v*2)%mod;
// 所以倒着处理时: v=(t+mod)/2;
//有三种拓展情况
int a[]={t-1,t/2,(t+mod)/2};
for(int i=0;i<3;i++)
{
if(dist[a[i]]==-1)
{
dist[a[i]]=dist[t]+1;
q[++tt]=a[i];
}
}
}
dist[0]=0;
dist[mod]=1;
}
int main()
{
cin>>n;
bfs();
while(n--)
{
int x;
cin>>x;
cout<<dist[x]<<' ';
}
return 0;
}
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// using namespace std;
// const int N=103000,mod=32768;
// int n;
// int dist[N];
// int q[N];
// int bfs(int x)
// {
// int hh=0,tt=0;
// q[hh]=x;
// memset(dist,-1,sizeof dist);
// dist[x]=0;
// while(hh<=tt)
// {
// int t=q[hh++];
// if(t%mod==0) return dist[t];
// int a1=(t+1)%mod;
// int a2=(t*2)%mod;
// if(dist[a1]==-1)
// {
// dist[a1]=dist[t]+1;
// q[++tt]=a1;
// }
// if(dist[a2]==-1)
// {
// dist[a2]=dist[t]+1;
// q[++tt]=a2;
// }
// }
// return -1;
// }
// int main()
// {
// cin>>n;
// while(n--)
// {
// int x;
// cin>>x;
// cout<<bfs(x)<<endl;
// }
// return 0;
// }