其实就是用数组模拟然后不断除二,但是要注意两个节点差很远的情况,要先单独把大下标节点缩小
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int a[1050];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int k1,k2;
scanf("%d%d",&k1,&k2);
if(a[k1]==0)
printf("ERROR: T[%d] is NULL",k1);
else if(a[k2]==0)
printf("ERROR: T[%d] is NULL",k2);
else
{
if(k1>k2)
swap(k1,k2);
while(k1<k2)
k2/=2;
while(k1!=k2)
{
k1/=2;
if(k1==k2)
break;
k2/=2;
}
printf("%d %d",k1,a[k1]);
}
}