是我接触树类的第一道题呀,还是比较好理解的。还是注意找规律,对于一个结点k,其左子结点,右子结点的编号分别是2k和2k+1,好了直接上代码吧。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n&&n!=-1)
{
while(n--)
{
int d,i;
cin>>d>>i;
int k = 1;
for(int j=0; j<d-1; j++)
{
if(i%2)
{
k = k * 2;
i = (i + 1) / 2;
}
else
{
k = k * 2 + 1;
i = i / 2;
}
}
cout<<k<<endl;
}
}
return 0;
}