#include "testlib.h" #include using namespace std; using ll = long long; using pll = pair; #define all(a) begin(a), end(a) #define space inf.readChar(' ') #define endl inf.readChar('\n') #define eof inf.readEof() tuple read(ll min, ll max){ ll a = inf.readLong(min, max); endl; return tuple{a}; } template auto read(ll min, ll max, T... t){ ll a = inf.readLong(min, max); space; return tuple_cat(tuple{a}, read(t...)); } string read(string p){ return inf.readLine(p); } vector reads(ll N, ll min, ll max){ auto a = inf.readLongs(N, min, max); endl; return a; } vector read_lines(ll N, string p){ return inf.readLines(N, p); } template auto read_lines(ll N, T... t){ vector a; a.reserve(N); while(N--) a.push_back(read(t...)); return a; } vector> read_matrix(ll H, ll W, ll min, ll max){ vector> ans(H); for(auto& v : ans) v = reads(W, min, max); return ans; } const int MIN_N = 3; const int MAX_N = 20000; const int MAX_Q = 10000; struct DSU { vector parent; DSU(int n) { parent.resize(n); iota(parent.begin(), parent.end(), 0); } int find(int i) { if (parent[i] == i) return i; return parent[i] = find(parent[i]); } bool unite(int i, int j) { int root_i = find(i); int root_j = find(j); if (root_i != root_j) { parent[root_i] = root_j; return true; } return false; } }; int main() { registerValidation(); int N = inf.readInt(MIN_N, MAX_N); inf.readSpace(); long long max_q_limit = min((long long)MAX_Q, 1LL * N * (N - 1) / 2); int Q = inf.readInt(1, max_q_limit); inf.readEoln(); DSU dsu(N); set> edges; for (int i = 0; i < N - 1; ++i) { int u = inf.readInt(0, N - 1); inf.readSpace(); int v = inf.readInt(0, N - 1); inf.readEoln(); ensure(u != v); int min_v = min(u, v); int max_v = max(u, v); ensure(edges.insert({min_v, max_v}).second); ensure(dsu.unite(u, v)); } for (int i = 0; i < Q; ++i) { int u = inf.readInt(0, N - 1); inf.readSpace(); int v = inf.readInt(0, N - 1); inf.readEoln(); ensure(u != v); int min_v = min(u, v); int max_v = max(u, v); ensure(edges.insert({min_v, max_v}).second); } inf.readEof(); }