该题考查了满二叉树的基本性质,有观察可知,某个数x所处的层数k等于这个数的二进制最右边1的位置,比如12,它的二进制是1100,最右边的1的位置是3,所以12在的层数是k = 3,又由满二叉树的性质可得:该树的节点数等于2^k - 1,所以它的左右子树的节点数位(2^k - 1 - 1) / 2= 2^(k - 1) - 1,又由于2^(k - 1) = lowbit(x).左子树的节点的范围[min,x-1],右子树的范围是[x+1,max],所以min = x - lowbit(x) + 1,max = x + lowbit(x) +1;
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--){
int x;
scanf("%d",&x);
int t = x & (-x);
printf("%d %d\n",x-t+1,x+t-1);
}
return 0;
}