#include <bits/stdc++.h>   using namespace std;   template <typename TH>   void _dbg(const char* sdbg, TH h) {     cerr << sdbg <<  =  << h <<   n ;   }   template <typename TH, typename... TA>   void _dbg(const char* sdbg, TH h, TA... t) {     while (*sdbg !=  , ) cerr << *sdbg++;     cerr <<  =  << h <<  , ;     _dbg(sdbg + 1, t...);   }   template <class C>   void mini(C& a4, C b4) {     a4 = min(a4, b4);   }   template <class C>   void maxi(C& a4, C b4) {     a4 = max(a4, b4);   }   template <class T1, class T2>   ostream& operator<<(ostream& out, pair<T1, T2> pair) {     return out <<  (  << pair.first <<  ,   << pair.second <<  ) ;   }   template <class A, class B, class C>   struct Triple {     A first;     B second;     C third;     bool operator<(const Triple& t) const {       if (first != t.first) return first < t.first;       if (second != t.second) return second < t.second;       return third < t.third;     }   };   template <class T>   void ResizeVec(T&, vector<long long>) {}   template <class T>   void ResizeVec(vector<T>& vec, vector<long long> sz) {     vec.resize(sz[0]);     sz.erase(sz.begin());     if (sz.empty()) {       return;     }     for (T& v : vec) {       ResizeVec(v, sz);     }   }   template <class A, class B, class C>   ostream& operator<<(ostream& out, Triple<A, B, C> t) {     return out <<  (  << t.first <<  ,   << t.second <<  ,   << t.third <<  ) ;   }   template <class T>   ostream& operator<<(ostream& out, vector<T> vec) {     out <<  ( ;     for (auto& v : vec) out << v <<  ,  ;     return out <<  ) ;   }   const long long N = 1e5 + 5;   long long par[N];   long long rep[N];   long long sum2[N];   long long sz_cc[N];   long long sz_sub[N];   long long score[N];   long long Find(long long x) {     if (rep[x] == x) {       return x;     }     return rep[x] = Find(rep[x]);   }   long long n;   long long res;   long long pre[N], post[N];   long long d;   vector<long long> slo[N];   long long IsAnc(long long a, long long b) {     return pre[a] <= pre[b] && post[b] <= post[a];   }   void Union(long long a, long long b) {     a = Find(a);     b = Find(b);     assert(IsAnc(a, b));     if (a == b) {       return;     }     res -= score[a];     res -= score[b];     long long lower = sz_sub[b];     sum2[a] -= lower * lower;     long long upper = n - lower;     sum2[b] -= upper * upper;     sum2[a] += sum2[b];     sz_cc[a] += sz_cc[b];     long long s = sz_cc[a];     score[a] = s * (s - 1) * (s - 2) + 2 * s * (s - 1) * (n - s) +                s * ((n - s) * (n - s) - sum2[a]);     res += score[a];     rep[b] = a;   }   void Dfs(long long v) {     sz_sub[v] = 1;     d++;     pre[v] = d;     for (auto nei : slo[v]) {       if (sz_sub[nei]) {         continue;       }       par[nei] = v;       Dfs(nei);       sum2[v] += sz_sub[nei] * sz_sub[nei];       sz_sub[v] += sz_sub[nei];     }     long long upper = n - sz_sub[v];     sum2[v] += upper * upper;     long long s = 1;     score[v] = s * (s - 1) * (s - 2) + 2 * s * (s - 1) * (n - s) +                s * ((n - s) * (n - s) - sum2[v]);     res += score[v];     d++;     post[v] = d;   }   int32_t main() {     ios_base::sync_with_stdio(0);     cout << fixed << setprecision(10);     if (0) cout << fixed << setprecision(10);     cin.tie(0);     cin >> n;     for (long long i = (1); i <= (n); ++i) {       rep[i] = i;       sz_cc[i] = 1;     }     for (long long i = (1); i <= (n - 1); ++i) {       long long a, b;       cin >> a >> b;       slo[a].push_back(b);       slo[b].push_back(a);     }     Dfs(1);     long long q;     cin >> q;     cout << res <<   n ;     for (long long i = (1); i <= (q); ++i) {       long long a, b;       cin >> a >> b;       a = Find(a);       b = Find(b);       while (!IsAnc(a, b)) {         Union(par[a], a);         a = Find(a);       }       while (!IsAnc(b, a)) {         Union(par[b], b);         b = Find(b);       }       cout << res <<   n ;     }     return 0;   }