func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   bool umin(T& a, T b) {     if (a > b) {       a = b;       return 1;     }     return 0;   }   template <class T>   bool umax(T& a, T b) {     if (a < b) {       a = b;       return 1;     }     return 0;   }   vector<int> b[200009], r[200009];   vector<pair<int, int> > upd[200009][2];   vector<int> last, now;   int blue[200009], red[200009], type = 1, TIM, vis[200009][2];   int bin[200009], bout[200009], rin[200009], rout[200009];   void dfsB(int nd, int pr) {     bin[nd] = ++TIM;     for (int i = 0; i < int(b[nd].size()); i++) {       int to = b[nd][i];       if (to == pr) continue;       dfsB(to, nd);     }     bout[nd] = TIM;   }   void dfsR(int nd, int pr) {     rin[nd] = ++TIM;     for (int i = 0; i < int(r[nd].size()); i++) {       int to = r[nd][i];       if (to == pr) continue;       dfsR(to, nd);     }     rout[nd] = TIM;   }   struct Two_Rooted_Tree {     vector<pair<int, int> > s[200009 << 2];     int st[200009 << 2], en[200009 << 2];     void merge(int nd) {       int p1 = 0, p2 = 0;       int s1 = s[nd << 1].size();       int s2 = s[nd << 1 | 1].size();       st[nd] = 0;       en[nd] = s1 + s2 - 1;       while (p1 + p2 < s1 + s2) {         if (p1 >= s1)           s[nd].push_back(s[nd << 1 | 1][p2++]);         else if (p2 >= s2)           s[nd].push_back(s[nd << 1][p1++]);         else if (s[nd << 1][p1] <= s[nd << 1 | 1][p2])           s[nd].push_back(s[nd << 1][p1++]);         else           s[nd].push_back(s[nd << 1 | 1][p2++]);       }     }     void build(int tp, int nd, int x, int y) {       s[nd].clear();       if (x == y) {         st[nd] = 0;         en[nd] = -1;         for (__typeof((upd[x][tp]).begin()) it = (upd[x][tp]).begin();              it != (upd[x][tp]).end(); it++) {           s[nd].push_back(*it);           en[nd]++;         }         sort(s[nd].begin(), s[nd].end());         return;       }       int mid = (x + y) >> 1;       build(tp, nd << 1, x, mid);       build(tp, nd << 1 | 1, mid + 1, y);       merge(nd);     }     void tap(int l, int r, int nd, int x, int y) {       if (l > y or x > r) return;       if (l <= x and y <= r) {         while (st[nd] <= en[nd] and s[nd][st[nd]].first < l) {           if (!vis[s[nd][st[nd]].second][type]) {             vis[s[nd][st[nd]].second][type] = 1;             now.push_back(s[nd][st[nd]].second);           }           st[nd]++;         }         while (st[nd] <= en[nd] and s[nd][en[nd]].first > r) {           if (!vis[s[nd][en[nd]].second][type]) {             vis[s[nd][en[nd]].second][type] = 1;             now.push_back(s[nd][en[nd]].second);           }           en[nd]--;         }         return;       }       int mid = (x + y) >> 1;       tap(l, r, nd << 1, x, mid);       tap(l, r, nd << 1 | 1, mid + 1, y);     }   } B, R;   int main() {     int n;     scanf( %d , &n);     for (int i = 1; i < n; i++) {       scanf( %d , blue + i);       b[i + 1].push_back(blue[i]);       b[blue[i]].push_back(i + 1);     }     for (int i = 1; i < n; i++) {       scanf( %d , red + i);       r[i + 1].push_back(red[i]);       r[red[i]].push_back(i + 1);     }     dfsB(1, -1);     TIM = 0;     dfsR(1, -1);     TIM = 0;     for (int i = 1; i <= n; i++) {       int u = i + 1;       int v = blue[i];       upd[rin[u]][1].push_back(make_pair(rin[v], i));       upd[rin[v]][1].push_back(make_pair(rin[u], i));     }     for (int i = 1; i <= n; i++) {       int u = i + 1;       int v = red[i];       upd[bin[u]][0].push_back(make_pair(bin[v], i));       upd[bin[v]][0].push_back(make_pair(bin[u], i));     }     B.build(0, 1, 1, n);     R.build(1, 1, 1, n);     int ind;     scanf( %d , &ind);     last.push_back(ind);     vis[ind][0] = 1;     printf( Blue n%d n , ind);     while (1) {       for (int i = 0; i < int(last.size()); i++) {         if (type) {           int u = blue[last[i]];           int v = last[i] + 1;           if (bin[v] <= bin[u] and bout[u] <= bout[v]) swap(u, v);           if (bin[u] <= bin[v] and bout[v] <= bout[u])             B.tap(bin[v], bout[v], 1, 1, n);         } else {           int u = red[last[i]];           int v = last[i] + 1;           if (rin[v] <= rin[u] and rout[u] <= rout[v]) swap(u, v);           if (rin[u] <= rin[v] and rout[v] <= rout[u])             R.tap(rin[v], rout[v], 1, 1, n);         }       }       if (now.size() == 0) break;       sort(now.begin(), now.end());       if (type)         printf( Red n );       else         printf( Blue n );       type = (1 - type);       for (__typeof((now).begin()) it = (now).begin(); it != (now).end(); it++)         printf( %d  , *it);       puts(  );       swap(last, now);       now.clear();     }     return 0;   }   