func_code_string: #include <bits/stdc++.h>   using namespace std;   int N, edge;   pair<int, int> E[2][200002];   vector<int> V[2][200002];   int in[2][200002], out[2][200002];   bool S[2][200002], isdel[2][200002];   vector<pair<pair<int, int>, int> > ARBf[2][4 * 200002], ARBs[2][4 * 200002];   int Ap1, Ap2, Apv, Ax1, Ax2;   vector<int> auxst;   void updatef(int w, int nod, int i1, int i2) {     ARBf[w][nod].push_back(make_pair(make_pair(Ap1, Ap2), Apv));     if (i1 == i2) return;     int mid = (i1 + i2) / 2;     if (Ap1 <= mid)       updatef(w, nod * 2, i1, mid);     else       updatef(w, nod * 2 + 1, mid + 1, i2);   }   void erasef(int w, int nod, int i1, int i2) {     if (Ax1 <= i1 && i2 <= Ax2) {       while (!ARBf[w][nod].empty() && (ARBf[w][nod].back().first.second > Ax2 ||                                        isdel[w][ARBf[w][nod].back().second])) {         if (!isdel[w][ARBf[w][nod].back().second]) {           auxst.push_back(ARBf[w][nod].back().second);           isdel[w][ARBf[w][nod].back().second] = true;         }         ARBf[w][nod].pop_back();       }       return;     }     int mid = (i1 + i2) / 2;     if (Ax1 <= mid) erasef(w, nod * 2, i1, mid);     if (Ax2 > mid) erasef(w, nod * 2 + 1, mid + 1, i2);   }   void updates(int w, int nod, int i1, int i2) {     ARBs[w][nod].push_back(make_pair(make_pair(Ap1, Ap2), Apv));     if (i1 == i2) return;     int mid = (i1 + i2) / 2;     if (Ap2 <= mid)       updates(w, nod * 2, i1, mid);     else       updates(w, nod * 2 + 1, mid + 1, i2);   }   void erases(int w, int nod, int i1, int i2) {     if (Ax1 <= i1 && i2 <= Ax2) {       while (!ARBs[w][nod].empty() && (ARBs[w][nod].back().first.first < Ax1 ||                                        isdel[w][ARBs[w][nod].back().second])) {         if (!isdel[w][ARBs[w][nod].back().second]) {           auxst.push_back(ARBs[w][nod].back().second);           isdel[w][ARBs[w][nod].back().second] = true;         }         ARBs[w][nod].pop_back();       }       return;     }     int mid = (i1 + i2) / 2;     if (Ax1 <= mid) erases(w, nod * 2, i1, mid);     if (Ax2 > mid) erases(w, nod * 2 + 1, mid + 1, i2);   }   void Dfs(int w, int x) {     S[w][x] = true;     in[w][x] = ++in[w][0];     for (auto it = V[w][x].begin(); it != V[w][x].end(); ++it)       if (!S[w][*it]) Dfs(w, *it);     out[w][x] = in[w][0];   }   int main() {     cin.sync_with_stdio(false);     cin >> N;     for (int w = 0; w < 2; ++w)       for (int i = 2, nod; i <= N; ++i) {         cin >> nod;         V[w][i].push_back(nod);         V[w][nod].push_back(i);         E[w][i - 1] = make_pair(min(i, nod), max(i, nod));       }     cin >> edge;     for (int w = 0; w < 2; ++w) Dfs(w, 1);     for (int w = 0; w < 2; ++w) {       vector<pair<pair<int, int>, int> > aux;       for (int i = 1; i <= N - 1; ++i) {         if (w == 0 && i == edge) continue;         Ap1 = in[!w][E[w][i].first], Ap2 = in[!w][E[w][i].second], Apv = i;         if (Ap1 > Ap2) swap(Ap1, Ap2);         aux.push_back(make_pair(make_pair(Ap1, Ap2), Apv));       }       sort(aux.begin(), aux.end());       for (int i = int(aux.size()) - 1; i >= 0; --i) {         Ap1 = aux[i].first.first, Ap2 = aux[i].first.second, Apv = aux[i].second;         updates(w, 1, 1, N);         swap(aux[i].first.first, aux[i].first.second);       }       sort(aux.begin(), aux.end());       for (int i = 0; i < int(aux.size()); ++i) {         swap(aux[i].first.first, aux[i].first.second);         Ap1 = aux[i].first.first, Ap2 = aux[i].first.second, Apv = aux[i].second;         updatef(w, 1, 1, N);       }     }     vector<int> st;     st.push_back(edge);     for (int i = 0; !st.empty(); ++i) {       if (i & 1)         printf( Red n );       else         printf( Blue n );       int w = i % 2;       auxst.clear();       sort(st.begin(), st.end());       for (int j = 0; j < int(st.size()); ++j) {         int e = st[j];         printf( %d  , e);         if (in[w][E[w][e].first] < in[w][E[w][e].second]) {           Ax1 = in[w][E[w][e].second];           Ax2 = out[w][E[w][e].second];         } else {           Ax1 = in[w][E[w][e].first];           Ax2 = out[w][E[w][e].first];         }         erasef(!w, 1, 1, N);         erases(!w, 1, 1, N);       }       st = auxst;       printf(  n );     }   }   