Language: C++

#include <vector>
#include <list>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <utility>
#include <functional>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <climits>
#include <cassert>
using namespace std;
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef long long ll;
#define ALL(a) (a).begin(),(a).end()
#define RALL(a) (a).rbegin(),(a).rend()
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define EACH(t,i,c) for(t::iterator i=(c).begin(); i!=(c).end(); ++i)
const double EPS = 1e-10;
const double PI  = acos(-1.0);

struct person{
	vector<person> children;
	string name;
	person(string name):name(name){}
	int construct(vs &names,int indent,int index){
		FOR(i,index,names.size()){
			int next_indent=count(ALL(names[i]),' ');
			if(next_indent==indent+1){
				string next_name=names[i];
				next_name.erase(next_name.begin(),next_name.begin()+next_indent);
				children.push_back(person(next_name));
			}else if(next_indent>indent+1){
				i=children[children.size()-1].construct(names,indent+1,i)-1;
			}else{
				return i;
			}
		}
		return names.size();
	}
	bool is_child(string a,string b){
		if(name==b){
			REP(i,children.size()){
				if(children[i].name==a){
					return true;
				}
			}
			return false;
		}
		REP(i,children.size()){
			if(children[i].is_child(a,b)){
				return true;
			}
		}
		return false;
	}
	bool is_descendant(string a,string b,bool flag=false){
		if(flag&&name==a){
			return true;
		}
		if(name==b){
			REP(i,children.size()){
				if(children[i].is_descendant(a,b,true)){
					return true;
				}
			}
			return false;
		}
		REP(i,children.size()){
			if(children[i].is_descendant(a,b)){
				return true;
			}
		}
		return false;
	}
	bool is_parent(string a,string b){
		if(name==a){
			REP(i,children.size()){
				if(children[i].name==b){
					return true;
				}
			}
			return false;
		}
		REP(i,children.size()){
			if(children[i].is_parent(a,b)){
				return true;
			}
		}
		return false;
	}
	bool is_ancestor(string a,string b,bool flag=false){
		if(flag&&name==b){
			return true;
		}
		if(name==a){
			REP(i,children.size()){
				if(children[i].is_ancestor(a,b,true)){
					return true;
				}
			}
			return false;
		}
		REP(i,children.size()){
			if(children[i].is_ancestor(a,b)){
				return true;
			}
		}
		return false;
	}
	bool is_sibling(string a,string b){
		bool flag=false;
		REP(i,children.size()){
			if(children[i].name==a||children[i].name==b){
				if(flag){
					return true;
				}
				flag=true;
			}
		}
		REP(i,children.size()){
			if(children[i].is_sibling(a,b)){
				return true;
			}
		}
		return false;
	}
};

int main(){
	int n,m;
	while(cin>>n>>m,n&&m){
		string name;
		getline(cin,name);
		getline(cin,name);
		person &root=person(name);
		vs names;
		REP(i,n-1){
			getline(cin,name);
			names.push_back(name);
		}
		int index=0;
		root.construct(names,0,index);
		REP(i,m){
			string a,b,rel,trash;
			cin>>a>>trash>>trash>>rel>>trash>>b;
			bool ok;
			b.erase(b.end()-1,b.end());
			if(rel=="child"){
				ok=root.is_child(a,b);
			}else if(rel=="parent"){
				ok=root.is_parent(a,b);
			}else if(rel=="ancestor"){
				ok=root.is_ancestor(a,b);
			}else if(rel=="descendant"){
				ok=root.is_descendant(a,b);
			}else if(rel=="sibling"){
				ok=root.is_sibling(a,b);
			}else{
				assert(0);
			}
			cout<<(ok?"True":"False")<<endl;
		}
		cout<<endl;

	}
}

Compiler output:
a.cc: In function 'int main()':
a.cc:153:30: error: cannot bind non-const lvalue reference of type 'person&' to an rvalue of type 'person'
  153 |                 person &root=person(name);
      |                              ^~~~~~~~~~~~