#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <array>
#include <bitset>
#include <assert.h>
using namespace std;

#define REP(i,n) for(int i=0; i<n; ++i)
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for (int i=a; i>=b; --i)
#define ALL(c) (c).begin(), (c).end()

typedef long long ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef vector<VI> VVI;
typedef vector<VL> VVL;
typedef pair<int,int> P;
typedef pair<ll,ll> PL;

int in() { int x; scanf("%d", &x); return x; }
ll lin() { ll x; scanf("%lld", &x); return x; }

struct SqrtDecomposition{
    int n, sqrtn, k;
    VI dat, buk, lazy;
    vector<bool> lazyflag;

    void init(int x){
        n = x;
        sqrtn = sqrt(n);
        k = (n + sqrtn - 1) / sqrtn;
        dat.assign(sqrtn * k, 0);
        buk.assign(k, 0);
        lazy.assign(k, 0);
        lazyflag.assign(k, false);
    }

    void eval(int b){
        if (!lazyflag[b]) return;
        lazyflag[b] = false;
        FOR(i, sqrtn * b, sqrtn * (b+1) - 1){
            dat[i] ^= lazy[b];
        }
        lazy[b] = 0;
    }

    // [l, r)
    void update(int l, int r){
        REP(b,k){
            int p = sqrtn * b;
            int q = sqrtn * (b+1);
            if (q <= l || r <= p) continue;
            if (l <= p && q <= r){
                buk[b] = sqrtn - buk[b];
                lazyflag[b] = true;
                lazy[b] ^= 1;
            }else{
                eval(b);
                FOR(i,max(l,p),min(r,q)-1){
                    dat[i] ^= 1;
                }
                buk[b] = 0;
                FOR(i,p,q-1){
                    buk[b] += dat[i];
                }
            }
        }
    }

    // [l, r)
    int query(int l, int r){
        int ret = 0;
        REP(b,k){
            int p = sqrtn * b;
            int q = sqrtn * (b+1);
            if (q <= l || r <= p) continue;
            if (l <= p && q <= r){
                ret += buk[b];
            }else{
                eval(b);
                FOR(i,max(l,p),min(r,q)-1){
                    ret += dat[i];
                }
            }
        }
        return ret;
    }
};

const int N = 200000;
VI e[N];
int le[N], ri[N];
int tm;

void euler_tour(int now, int past){
    le[now] = tm++;
    for (int next : e[now]){
        if (next == past) continue;
        euler_tour(next, now);
    }
    ri[now] = tm++;
}

int main() {
    int n, q;
    cin >> n >> q;
    REP(i,n-1){
        int p = in();
        p--;
        e[i+1].push_back(p);
        e[p].push_back(i+1);
    }

    euler_tour(0, -1);

    // REP(i,n) cout << le[i] << " " << ri[i] << endl;

    SqrtDecomposition sd;
    sd.init(2 * n);

    REP(i,n){
        char c;
        cin >> c;
        if (c == 'G'){
            sd.update(le[i], le[i] + 1);
            sd.update(ri[i], ri[i] + 1);
        }
    }


    while (q--){
        int v = in() - 1;
        sd.update(le[v], ri[v] + 1);
        // REP(i,2*n) cout << sd.query(i, i+1) << " ";
        // cout << endl;
        int x = sd.query(0, 2*n);
        // cout << x << endl;
        if (x > n) cout << "broccoli" << endl;
        else cout << "cauliflower" << endl;
    }


    return 0;
}


Measured memory_bytes: 16928