思路在代码里
#include <bits/stdc++.h>
using namespace std;
int heap[1001],n;
void insert(int n,int num)//插入并构建最小堆
{
heap[n]=num;
int l=n;
while(l/2>=1)
{
int temp=l/2;
if (heap[l]<heap[temp])
{
int m=heap[l];
heap[l]=heap[temp];
heap[temp]=m;
}
l/=2;
}
}
int find(int a)
{
//根据给出的数值找出它在最小堆的哪个节点上
for (int i=1; i<=n; i++)
if (a==heap[i])
return i;
}
int main()
{
int i,j,k,m,x;
cin>>n>>m;
for (i=1; i<=n; i++)
{
cin>>x;
insert(i,x);
}
int a;
for (i=0; i<m; i++)
{
cin>>a;//第一个数
string p1;
cin>>p1;//第一个数后面的单词
if (p1=="and")
{
int b;
cin>>b;
//对返回的节点编号除以2,如果a和b是兄弟节点那它们的父节点肯定一样
if (find(a)/2==find(b)/2)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
string p2,p3;
cin>>p2>>p3;
//后面两个没用的单词吸收一下
}
else
{
string p2;//第二个单词,判断是the或a
cin>>p2;
if (p2=="a")
{
string p3,p4;
int b;
cin>>p3>>p4;//吸收两个单词后出现第二个数字
cin>>b;
//如果a是b的一个子节点,那么a的父节点就是b,即a的下标除以2等于b的下标
if (find(a)/2==find(b))
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
else
{
//剩单词root或者 parent of
string p6;
cin>>p6;
if (p6=="root")
{
//如果a是根节点,它下标就是1
if (find(a)==1)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
else
{
//如果a是b的父节点,b下标除以2就是a下标
string p7;
int b;
cin>>p7>>b;
if (find(a)==find(b)/2)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
}
}
}
return 0;
}