写着写着发现越写越奇怪(囧),然后就去学习了一下二叉堆,好在这题用到的堆相当的基础. 就是字符串输入有点烦...
下次学习一下完整的堆。

二叉堆学习资料! 题目链接

#include <bits/stdc++.h>
#define MMAX 23333333
#define ABS 10000
using namespace std;
int H[MMAX],Index[MMAX];
int N, M, X, Y = 0, flag;
string s,tmp;

void push(int Index) {
	flag = 0;
	while(Index != 1 && !flag) 
		//这里的 >> 等于 除以2  偶尔回顾一下 
		H[Index] < H[Index>>1] ? swap(H[Index],H[Index>>1]), Index >>= 1: flag = 1;
}

int main() {
	s.resize(10000);
	scanf("%d %d", &N, &M);
	for(int i = 1; i <= N; i++) {
		scanf("%d", &X);
		H[i] = X + ABS;
		if(i != 1) push(i);
	}
	for(int i = 1; i <= N; i++) 
		Index[H[i]] = i;
	for(int i = 1; i <= M; i++) {
		cin>>X>>s;
		if(s == "and") {
			scanf("%d are siblings", &Y);
			Index[X + ABS] >> 1 == Index[Y + ABS] >> 1 ? printf("T\n") : printf("F\n");
		}else{
			cin>>s>>s;
			if(s == "root")
				Index[X + ABS] == 1 ? printf("T\n") : printf("F\n");
			else {
				cin>>tmp>>Y;
				if(s == "parent")
					Index[Y + ABS] >> 1 == Index[X + ABS] ? printf("T\n") : printf("F\n");
				else
					Index[X + ABS] >> 1 == Index[Y + ABS] ? printf("T\n") : printf("F\n");
			}
		}
	}
	return 0;
}