

解题思路:
1、边输入边建小顶堆(下标从1开始)
2、判断
1)、根结点则下标为1
2)、若为兄弟结点,则两者双亲结点相同
3)、儿子结点下标/2=双亲结点下标(注意:用 ‘/‘ 不用 ’*‘)
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define Max 1010
int arr[2]= {0};
int n,m;
void Adjust(int a[],int k,int n) {//向下调整堆
a[0]=a[k];
int i;
for(i=2*k; i<=n; i*=2) {
if(i<n&&a[i]>a[i+1])
i++;
if(a[0]<=a[i])break;
else {
a[k]=a[i];
k=i;
}
}
a[k]=a[0];
}
void BuildHeap(int a[],int n) {//建小顶堆
int i;
for(i=n/2; i>0; i--) {
Adjust(a,i,n);
}
}
int find(int tmp,int a[]) {//获取下标
int i;
for(i=1; i<=n; i++) {
if(a[i]==tmp) {
return i;
}
}
return -1;
}
void Out(int tag,int a[]) {//判断命题
int i;
int flag=0;
if(tag==1) {
if(find(arr[0],a)==1)
flag=1;
} else if(tag==2) {
if(find(arr[0],a)/2==find(arr[1],a)/2)
flag=1;
} else if(tag==3) {
if(find(arr[1],a)/2==find(arr[0],a))
flag=1;
} else if(tag==4) {
if(find(arr[1],a)==find(arr[0],a)/2)
flag=1;
}
printf("%c
",flag?'T':'F');
}
int main() {
scanf("%d %d",&n,&m);
int * a=(int *)malloc(sizeof(int)*Max);
int i;
for(i=1; i<=n; i++) {
scanf("%d",&a[i]);
BuildHeap(a,i);
}
char c[10],c1[10],c2[10];
int tag;
for(i=0; i<m; i++) {//字符处理
scanf("%d %s",&arr[0],&c);
if(!strcmp(c,"and")) {
tag=2;
scanf("%d %s%s",&arr[1],&c1,&c2);
Out(tag,a);
continue;
}
scanf("%s",&c);
if(!strcmp(c,"a")) {
tag=4;
scanf("%s%s%d",&c1,&c2,&arr[1]);
Out(tag,a);
continue;
}
scanf("%s",&c);
if(!strcmp(c,"parent")) {
tag=3;
scanf("%s%d",&c1,&arr[1]);
Out(tag,a);
continue;
}
if(!strcmp(c,"root")) {
tag=1;
Out(tag,a);
continue;
}
}
return 0;
}