#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define eni(r) sim> typename enable_if <1 r sizeof(dud(0)),muu&>::type operator<<(c g) { sim> struct rge {c b,e ;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c *r)-> decltype(cerr << *r); sim> char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() {cerr << a.str() << endl;} eni(<) a << boolalpha << g; ris;} eni(==) ris << range(begin(g), end(g));} sim, class m mor pair r) {ris << "(" << r.first << ", " << r.second << ")";} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } #else sim mor const c&) {ris;} #endif muu & operator()(){ris;} }; #define debug (muu() << __FUNCTION__ << "#" << __LINE__ << ": ") #define imie(r) "[" #r ": " << (r) << "] " #define imask(r) "[" #r ": " << bitset<8 * sizeof(r)>(r) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " #define arr2(a, i, j) "[" #a imie(i) imie(j) ": " << a[i][j] << "] " using point = pair , int>; using ite = vector::iterator; const int nax = 1010; vector graf[nax]; vector > ans; int size[nax]; void dfs(int x, int y) { size[x] = 1; for (int v : graf[x]) if (v != y) { dfs(v, x); size[x] += size[v]; } } void run(ite beg, ite end, int curr, int p, int conn) { sort(beg, end); debug << range(beg, end) << arr(size, curr) imie(p) imie(conn); if (conn != -1) ans.emplace_back(beg->second, conn); point center = *beg; sort(beg + 1, end, [center](point a, point b) { return (center.first.first - a.first.first) * 1ll * (center.first.second - b.first.second) > (center.first.first - b.first.first) * 1ll * (center.first.second - a.first.second); }); ite pos = beg + 1; for (int v : graf[curr]) if (v != p) { run(pos, pos + size[v], v, curr, beg->second); pos += size[v]; } } int main() { int n; scanf("%d", &n); for (int i = 0; i < n - 1; ++i) { int a, b; scanf("%d%d", &a, &b); graf[a].push_back(b); graf[b].push_back(a); } dfs(0, 0); vector points; for (int i = 0; i < n; ++i) { int x, y; scanf("%d%d", &x, &y); points.emplace_back(make_pair(x, y), i); } run(points.begin(), points.end(), 0, -1, -1); for (auto x : ans) printf("%d %d\n", x.first, x.second); }