#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;
}
