#include <iostream>
#include <vector>
#include <algorithm>
#define rep(i, n) for (i = 0; i < n; i++)
using namespace std;

const int DEPTH = 17;
class SegTree {
	int num[1 << (DEPTH + 1)];	//区間の和(= 1の個数)
	int lazy[1 << (DEPTH + 1)];	//反転クエリをlazy[i]個貯めている
	
	void commit(int id, int tSize) {
		num[id] = tSize - num[id];
		if (tSize >= 2) {
			lazy[id * 2 + 1] = !lazy[id * 2 + 1];
			lazy[id * 2 + 2] = !lazy[id * 2 + 2];
		}
		lazy[id] = 0;
	}
	
public:
	SegTree() {
		int i; rep(i, (1 << (DEPTH + 1))) { num[i] = lazy[i] = 0; }
	}
	
	//pos(>=0)番目の葉の値をx(=0, 1)にする (lazyは全て0とします)
	void change(int pos, int x) {
		pos += (1 << DEPTH) - 1;
		num[pos] = x;
		while (pos > 0) {
			pos = (pos - 1) / 2;
			num[pos] = num[pos * 2 + 1] + num[pos * 2 + 2];
		}
	}
	
	//[l, r)を反転
	void update(int l, int r, int a = 0, int b = (1 << DEPTH), int id = 0) {
		if (a >= r || b <= l) return;
		if (l <= a && b <= r) {
			lazy[id] = !lazy[id];
			
			int pid = id;
			int cnt = 1;
			while (pid > 0) {
				pid = (pid - 1) / 2;
				if (lazy[pid * 2 + 1]) commit(pid * 2 + 1, (b - a) * cnt);
				if (lazy[pid * 2 + 2]) commit(pid * 2 + 2, (b - a) * cnt);
				num[pid] = num[pid * 2 + 1] + num[pid * 2 + 2];
				cnt *= 2;
			}
			return;
		}
		update(l, r, a, a + (b - a) / 2, id * 2 + 1);
		update(l, r, a + (b - a) / 2, b, id * 2 + 2);
	}
	
	//[l, r)の和を取得
	int getSum(int l, int r, int a = 0, int b = (1 << DEPTH), int id = 0) {
		if (a >= r || b <= l) return 0;
		if (lazy[id]) { commit(id, b - a); }
		if (l <= a && b <= r) { return num[id]; }
		int u = getSum(l, r, a, a + (b - a) / 2, id * 2 + 1);
		int v = getSum(l, r, a + (b - a) / 2, b, id * 2 + 2);
		return u + v;
	}
	
	//セグ木の表示
	typedef pair<int, int> P;
	vector<P> printPos;
	void setPrintPos(int a = 0, int b = (1 << DEPTH), int id = 0, int dep = 0) {
		printPos.push_back(P(dep, a + (b - a) / 2));
		if (b - a >= 2) {
			setPrintPos(a, a + (b - a) / 2, id * 2 + 1, dep + 1);
			setPrintPos(a + (b - a) / 2, b, id * 2 + 2, dep + 1);
		}
	}
	
	void sortPrintPos() {
		sort(printPos.begin(), printPos.end());
	}
	
	void print() {
		int y = 0, x = 0;
		for (int i = 0; i < printPos.size(); i++) {
			int py = printPos[i].first;
			int px = printPos[i].second;
			if (py > y) { while (y < py) { cout << endl; y++; } }
			if (px > x) { while (x < px) { cout << " "; x++; } }
			cout << "[" << num[i] << ", " << lazy[i] << "]";
		}
		cout << endl;
	}
};

int n, q;
int p[100000];
char c[100000];
int qv[100000];
vector<int> et[100000];
int ord[100000];	//行きがけ順
int tSize[100000];	//部分木のサイズ

void input() {
	int i;
	cin >> n >> q;
	for (i = 1; i < n; i++) { cin >> p[i]; p[i]--; et[p[i]].push_back(i); }
	rep(i, n) cin >> c[i];
	rep(i, q) { cin >> qv[i]; qv[i]--; }
}

int timer = 0;
int tourist(int v) {
	tSize[v] = 1;
	ord[v] = timer;
	for (int i = 0; i < et[v].size(); i++) {
		timer++;
		tSize[v] += tourist(et[v][i]);
	}
	return tSize[v];
}

SegTree seg;

int main() {
	int i;
	input();
	tourist(0);
	
	for (i = 0; i < n; i++) {
		seg.change(ord[i], (c[i] == 'G'));
		//cout << i << " -> " << ord[i] << " " << (c[i] == 'G') << endl;
	}
	//cout << "sum = " << seg.getSum(0, n) << endl;
	
	//seg.setPrintPos();
	//seg.sortPrintPos();
	//seg.print();
	
	for (i = 0; i < q; i++) {
		int l = ord[qv[i]];
		int r = l + tSize[qv[i]];
		//cout << "[l, r) = " << l << " " << r << endl;
		//区間[l, r)を反転する
		seg.update(l, r);
		//区間[0, n)の和を得る
		int iti = seg.getSum(0, n);
		//cout << "sum = " << iti << endl;
		//デバッグ
		//seg.print();
		int zero = n - iti;
		if (iti > zero) { cout << "broccoli" << endl; }
		else { cout << "cauliflower" << endl; }
	}
	return 0;
}


Measured memory_bytes: 16964