func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e5 + 7;   const int logn = 19;   vector<int> adj[maxn];   int idcnt, l[maxn], r[maxn], dep[maxn], anc[maxn][logn];   void dfs1(int u, int up) {     l[u] = ++idcnt;     dep[u] = dep[up] + 1;     anc[u][0] = up;     for (int i = 1; i < logn; i++) {       if (dep[u] <= (1 << i)) break;       anc[u][i] = anc[anc[u][i - 1]][i - 1];     }     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i];       if (v == up) continue;       dfs1(v, u);     }     r[u] = idcnt;   }   int qlca(int u, int v) {     if (dep[u] > dep[v]) swap(u, v);     for (int i = logn - 1; i >= 0; i--)       if (dep[v] > (1 << i) && dep[anc[v][i]] >= dep[u]) v = anc[v][i];     if (u == v) return u;     for (int i = logn - 1; i >= 0; i--)       if (dep[u] > (1 << i) && anc[u][i] != anc[v][i]) {         u = anc[u][i];         v = anc[v][i];       }     return anc[u][0];   }   vector<int> bus[maxn];   int nex[maxn][logn];   void dfs2(int u, int up) {     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i];       if (v == up) continue;       dfs2(v, u);       if (dep[nex[v][0]] < dep[nex[u][0]]) nex[u][0] = nex[v][0];     }   }   int n, st[maxn];   int lowbit(int x) { return x & (-x); }   void add(int i, int x) {     for (; i <= n; i += lowbit(i)) st[i] += x;   }   int qsum(int i) {     int res = 0;     for (; i > 0; i -= lowbit(i)) res += st[i];     return res;   }   struct node {     int id, v;     node(int id = 0, int v = 0) : id(id), v(v) {}   };   vector<node> ql[maxn];   int ans[maxn], cmp[maxn];   void dfs3(int u, int up) {     for (int i = 0; i < ql[u].size(); i++) {       node cur = ql[u][i];       int id = cur.id, v = cur.v;       cmp[id] = qsum(r[v]) - qsum(l[v] - 1);     }     for (int i = 0; i < bus[u].size(); i++) {       int v = bus[u][i];       add(l[v], 1);     }     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i];       if (v == up) continue;       dfs3(v, u);     }     for (int i = 0; i < ql[u].size(); i++) {       node cur = ql[u][i];       int id = cur.id, v = cur.v;       if (qsum(r[v]) - qsum(l[v] - 1) != cmp[id]) ans[id]--;     }   }   int main() {     scanf( %d , &n);     for (int i = 2; i <= n; i++) {       int v;       scanf( %d , &v);       adj[i].push_back(v);       adj[v].push_back(i);     }     dfs1(1, 1);     int m;     scanf( %d , &m);     for (int i = 1; i <= n; i++) nex[i][0] = i;     for (int i = 1; i <= m; i++) {       int a, b;       scanf( %d%d , &a, &b);       bus[a].push_back(b);       bus[b].push_back(a);       int lca = qlca(a, b);       if (dep[lca] < dep[nex[a][0]]) nex[a][0] = lca;       if (dep[lca] < dep[nex[b][0]]) nex[b][0] = lca;     }     dfs2(1, 1);     for (int i = 1; i < logn; i++)       for (int j = 1; j <= n; j++) nex[j][i] = nex[nex[j][i - 1]][i - 1];     int q;     scanf( %d , &q);     for (int i = 1; i <= q; i++) {       int u, v;       scanf( %d%d , &u, &v);       if (u > v) swap(u, v);       int lca = qlca(u, v);       for (int j = logn - 1; j >= 0; j--)         if (dep[nex[v][j]] > dep[lca]) {           v = nex[v][j];           ans[i] += (1 << j);         }       if (u == lca) {         if (dep[nex[v][0]] > dep[lca]) {           ans[i] = -1;           continue;         }         if (dep[v] > dep[lca]) ans[i]++;       } else {         for (int j = logn - 1; j >= 0; j--)           if (dep[nex[u][j]] > dep[lca]) {             u = nex[u][j];             ans[i] += (1 << j);           }         if (dep[nex[u][0]] > dep[lca] || dep[nex[v][0]] > dep[lca]) {           ans[i] = -1;           continue;         }         ans[i] += 2;         if (u > v) swap(u, v);         ql[u].push_back(node(i, v));       }     }     dfs3(1, 1);     for (int i = 1; i <= q; i++) printf( %d n , ans[i]);     return 0;   }   