//四进制下的表
//001 002 003
//1行 第一段
//010 020 030
//011 022 033
//012 023 031
//013 021 032
//4行 第二段
//100 200 300
//101 202 303
//102 203 301
//103 201 302
//110 220 330
//111 222 333
//112 223 331
//113 221 332
//120 230 330
//121
//……
//16行 第三段
#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep_1(i,m,n) for(int i=m;i<=n;i++)
#define mem(st) memset(st,0,sizeof st)
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef pair<double,double> pdd;
const int inf = 0x3f3f3f3f;
int main()
{
ll t;
cin>>t;
while(t--)
{
//p-1是要特殊处理第一行
//连续的段内,每个三元组的第一位是连续+1的
//段的长度是4的次幂
//然后第一行的三元组,是三个都连续+1的,1 2 3
//p-1 是特殊处理第一行
//n是无限序列中的第几个
//p代表行数
ll n;
cin>>n;
ll p=(n-1)/3,s=1,all=0;
//找出当前位置的数字所在的段
while(p>=s)
{
//减去每个段中的数字
p-=s;
//每一段 中 的 行数
s<<=2;
}
//三元组的第一个
//每一段开头的第一个数 是 s ,p代表的是行数
//就直接加
if(n%3==1)
printf("%lld\n",s+p);
//三元组的第二个
//也就是某一行的第二个
//对于某一行的三元组
//对应位数 不是0 的 是 1 2 3循环的
//113 221 332
//
else if(n%3==2)
{
//
ll ans=s<<1,c=1;
while(p)
{
//四进制的最低为
ll x=p%4;
//如果是1
if(x==1)
ans+=c*2;
else if(x==2)
ans+=c*3;
else if(x==3)
ans+=c;
p>>=2,c<<=2;
}
printf("%lld\n",ans);
}
else
{
ll ans=s*3,c=1;
while(p)
{
ll x=p%4;
if(x==1)
ans+=c*3;
else if(x==2)
ans+=c*1;
else if(x==3)
ans+=c*2;
p>>=2,c<<=2;
}
printf("%lld\n",ans);
}
}
return 0;
}