#include using namespace std; struct LCA { vector vid; vector> g; vector>> mn; LCA(int n) : g(n), vid(n), mn(1) {} void add(int u, int v) { g[u].push_back(v); g[v].push_back(u); } void build() { dfs(0, -1, 0); int m = log2(mn[0].size()); mn.resize(m + 1, vector>(mn[0].size())); for (int i = 0; i < m; i++) { for (int j = 0; j + (1 << i) < mn[i].size(); j++) { mn[i + 1][j] = min(mn[i][j], mn[i][j + (1 << i)]); } } } void dfs(int curr, int prev, int d) { vid[curr] = mn[0].size(); mn[0].emplace_back(d, curr); for (int next : g[curr]) if (next != prev) { dfs(next, curr, d + 1); mn[0].emplace_back(d, curr); } } int query(int u, int v) { int l, r; tie(l, r) = minmax(vid[u], vid[v]); int k = 31 - __builtin_clz(r + 1 - l); return min(mn[k][l], mn[k][r + 1 - (1 << k)]).second; } }; vector g[101010]; long long imos[101010]; long long part[101010]; void dfs(int curr, int prev) { for (int next : g[curr]) if (next != prev) { dfs(next, curr); } if (prev != -1) { imos[prev] += imos[curr]; } } int main() { int n; cin >> n; LCA lca(n); for (int i = 0; i < n - 1; i++) { int u, v; scanf("%d %d", &u, &v); u--; v--; g[u].push_back(v); g[v].push_back(u); lca.add(u, v); } lca.build(); int Q; cin >> Q; while (Q--) { int u, v; scanf("%d %d", &u, &v); u--; v--; int l = lca.query(u, v); imos[u]++; imos[v]++; imos[l] -= 2; part[l]++; } dfs(0, -1); long long ans = 0; for (int i = 0; i < n; i++) { long long v = imos[i] + part[i]; ans += v * (v + 1) / 2; } cout << ans << endl; }