用数组模拟建堆,为了达到判断结点关系的目的需要用map
进行映射。
输入样例:
5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
输出样例:
F
T
F
T
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 5;
int a[N],n,m;
map<int,int>mp;
//建堆
void insert(int x,int p)
{
a[p] = x;
while(p!=1){
if(a[p]<a[p>>1]){
swap(a[p],a[p>>1]);
p>>=1;
}
else break;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
int t;
cin>>t;
insert(t,i);
}
for(int i=1;i<=n;i++) mp[a[i]]=i;//建立映射关系
for(int i=1;i<=m;i++){
bool flag = 0;
int p,q;
string s;
cin>>p>>s;
if(s=="and"){
cin>>q>>s>>s;
if(a[mp[p]^1]==q) flag = 1;
}
else{//s=="is"
cin>>s;
if(s=="a"){
cin>>s>>s>>q;
if(mp[p]/2==mp[q]) flag = 1;
} else {//s=="the"
cin>>s;
if(s=="root"){
if(a[1]==p) flag = 1;
} else {//s=="parent"
cin>>s>>q;
if(mp[q]/2==mp[p]) flag = 1;
}
}
}
if(flag)
cout<<"T\n";
else
cout<<"F\n";
}
return 0;
}