#include<string.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 10;
const int inf = 0x3f3f3f3f;
const int Base = 131;
const ll INF = 1ll << 62;
//const double PI = acos(-1);
const double eps = 1e-7;
const int mod = 1e9 + 9;
#define mem(a,b) memset(a,b,sizeof(a))
#define speed {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); }
int Heap[maxn];
int n, m;
void buildheap(int deep) {//建立小顶堆
int son = deep;
int fa = deep >> 1;
while (fa >= 1) {
if (Heap[son] < Heap[fa]) {
swap(Heap[fa], Heap[son]);
son = fa;
fa =fa>>1;
}else {
break;
}
}
}
int Search(int x) {//查询值的下标
for (int i = 1; i <= n; i++) {
if (Heap[i] == x) {
return i;
}
}
}
int main() {
scanf("%d %d",&n,&m);
for (int i = 1; i <= n; i++) {
scanf("%d",&Heap[i]);
buildheap(i);
}
getchar();
while(m--){
int a, b;
char s[50];
scanf("%d %s",&a,s);
if(s[0]=='a'){//判断是否是兄弟节点
scanf("%d",&b);
scanf("%s",s);
scanf("%s",s);
int p=Search(a)>>1;
if(Heap[p<<1]==b||Heap[p<<1|1]==b)puts("T");
else puts("F");
}else{
scanf("%s",s);
scanf("%s",s);
if(s[0]=='r'){//判断是否是根节点
if(a==Heap[1])puts("T");
else puts("F");
}
if(s[0]=='p'){//判断父亲节点
scanf("%s",s);
scanf("%d",&b);
int p=Search(b)>>1;
if(Heap[p]==a)puts("T");
else puts("F");
}
if(s[0]=='c'){//判断子节点
scanf("%s",s);
scanf("%d",&b);
int p=Search(a)>>1;
if(Heap[p]==b)puts("T");
else puts("F");
}
}
}
system("pause");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
//二叉树结点结构体
struct node
{
int data;
node *l, *r;
};
node* Build(int len, int a[], int b[]) //建树(模板)
{
node *root = new node;
if (len == 0)
return NULL;
int i;
root->data = a[0];
//判断是否相等进行交换
for (i = 0; i < len; i ++)
if (b[i] == a[0])
break;
root->l = Build(i, a + 1, b);
root->r = Build(len - i - 1, a + i + 1, b + i + 1);
return root;
}
//输出
void f(node *tree)
{
queue<node*> q;
if (tree)
{
cout << tree->data;
q.push(tree);
}
while (!q.empty())
{
node *root = q.front();
q.pop();
if (root->r) //本来是先root-<l,这里交换一下位置
{
cout << ' ' << root->r->data;
q.push(root->r);
}
if (root->l)
{
cout << ' ' << root->l->data;
q.push(root->l);
}
}
}
int main()
{
int n;
int a[111], b[111];
cin >> n;
//输入二叉树
for (int i = 0; i < n; i ++)
cin >> a[i];
for (int i = 0; i < n; i ++)
cin >> b[i];
node *tree = new node;
tree = Build(n, b, a);
f(tree);
return 0;
}