func_code_string: #include <bits/stdc++.h>   using namespace std;   void read(int &n) {     n = 0;     int s = 1;     char c;     for (; (c = getchar()) >  9  || c <  0 ;)       if (c ==  - ) s = -1;     for (; c >=  0  && c <=  9 ; c = getchar()) n = (n << 1) + (n << 3) + c - 48;     n *= s;   }   void write(int n) {     if (!n) putchar(48);     int t = 0, b[20];     for (; n; n /= 10) b[++t] = n % 10;     while (t) putchar(b[t--] + 48);   }   int f[18][200100], nxt[18][200100], m, n, q, deep[200100], fir[200100],       nex[200100], to[200100], top, son[10001001][2], siz[10001001], cnt,       rt[200100], dfl[200100], dfr[200100], mn[200100], opl, opr;   struct dot {     int a, b;   } a[200100 + 200100];   bool cmp(dot a, dot b) { return a.a < b.a; }   void dfs(int x) {     ++deep[x];     dfl[x] = dfr[x] = ++top;     for (int i = fir[x]; i; i = nex[i])       deep[to[i]] = deep[x], dfs(to[i]), dfr[x] = dfr[to[i]];   }   int lca(int x, int y) {     if (deep[x] > deep[y]) return lca(y, x);     for (int i(17), _E_(0); i >= _E_; --i)       if (deep[f[i][y]] >= deep[x]) y = f[i][y];     if (x == y) return x;     for (int i(17), _E_(0); i >= _E_; --i)       if (f[i][y] ^ f[i][x]) x = f[i][x], y = f[i][y];     return f[0][x];   }   void doit(int x) {     for (int i = fir[x]; i; i = nex[i]) {       doit(to[i]);       mn[x] = deep[mn[to[i]]] < deep[mn[x]] ? mn[to[i]] : mn[x];     }     if (x ^ mn[x]) nxt[0][x] = mn[x];   }   void update(int u, int &v, int h, int t) {     v = ++cnt;     siz[v] = siz[u] + 1;     son[v][0] = son[u][0];     son[v][1] = son[u][1];     if (h == t) return;     int m = h + t >> 1;     if (opl <= m)       update(son[u][0], son[v][0], h, m);     else       update(son[u][1], son[v][1], m + 1, t);   }   int query(int w, int h, int t) {     if (opl > t || opr < h || !w) return 0;     if (opl <= h && opr >= t) return siz[w];     int m = h + t >> 1, res = 0;     if (opl <= m) res += query(son[w][0], h, m);     if (opr > m) res += query(son[w][1], m + 1, t);     return res;   }   int exist(int u, int v) {     int sum = 0;     opr = dfr[v];     opl = dfl[v];     sum += query(rt[dfr[u]], 1, n);     opr = dfr[v];     opl = dfl[v];     sum -= query(rt[dfl[u] - 1], 1, n);     return sum > 0;   }   int main() {     scanf( %d , &n);     for (int i(1), _E_(n); i <= _E_; ++i) mn[i] = i;     for (int i(2), _E_(n); i <= _E_; ++i)       scanf( %d , f[0] + i), to[++top] = i, nex[top] = fir[f[0][i]],                              fir[f[0][i]] = top;     top = 0;     dfs(1);     scanf( %d , &m);     for (int j(1), _E_(17); j <= _E_; ++j)       for (int i(1), _E_(n); i <= _E_; ++i) f[j][i] = f[j - 1][f[j - 1][i]];     int t = 0;     for (int i(1), _E_(m); i <= _E_; ++i) {       int x, y, l;       scanf( %d %d , &x, &y);       l = lca(x, y);       a[++t] = (dot){dfl[x], dfl[y]};       a[++t] = (dot){dfl[y], dfl[x]};       mn[x] = deep[mn[x]] > deep[l] ? l : mn[x];       mn[y] = deep[mn[y]] > deep[l] ? l : mn[y];     }     doit(1);     sort(a + 1, a + m + m + 1, cmp);     for (int j(1), _E_(17); j <= _E_; ++j)       for (int i(1), _E_(n); i <= _E_; ++i) nxt[j][i] = nxt[j - 1][nxt[j - 1][i]];     for (int i(1), _E_(m + m); i <= _E_; ++i)       opl = a[i].b, update(rt[a[i - 1].a], rt[a[i].a], 1, n);     for (int i(1), _E_(n); i <= _E_; ++i)       if (!rt[i]) rt[i] = rt[i - 1];     scanf( %d , &q);     for (int i(1), _E_(q); i <= _E_; ++i) {       int u, v;       scanf( %d %d , &u, &v);       if (u == v) {         printf( 0 n );         continue;       }       int L = lca(u, v), ans = 0;       for (int j(17), _E_(0); j >= _E_; --j)         if (deep[nxt[j][u]] > deep[L]) u = nxt[j][u], ans += 1 << j;       for (int j(17), _E_(0); j >= _E_; --j)         if (deep[nxt[j][v]] > deep[L]) v = nxt[j][v], ans += 1 << j;       if (L == u && nxt[0][v])         printf( %d n , ans + 1);       else if (L == v && nxt[0][u])         printf( %d n , ans + 1);       else if (!nxt[0][u] || !nxt[0][v])         printf( -1 n );       else         printf( %d n , ans + 2 - exist(u, v));     }     return 0;   }   