func_code_string: #include <bits/stdc++.h>   using namespace std;   struct point {     long long x, y, index;     point(long long x, long long y, long long index) : x(x), y(y), index(index) {}     long long operator*(const point p) { return x * p.x + y * p.y; }     long long operator^(const point p) { return x * p.y - y * p.x; }     bool operator<(const point p) const {       return make_pair(x, y) < make_pair(p.x, p.y);     }     bool operator==(const point p) const { return x == p.x && y == p.y; }     bool operator!=(const point p) const { return !(*this == p); }     point operator*(long long scale) {       return point(scale * x, scale * y, index);     }     point operator+(const point p) { return point(x + p.x, y + p.y, index); }     point operator-(const point p) { return point(x - p.x, y - p.y, index); }     long long norm() { return (*this) * (*this); }   };   bool half(point p) {     assert(p.x != 0 || p.y != 0);     return p.x > 0 || (p.x == 0 && p.y > 0);   }   void polarSort(point o, vector<point> &v, int L, int R) {     sort(v.begin() + L, v.begin() + R, [&](point v, point w) {       return make_tuple(half(v - o), 0, (v - o).norm()) <              make_tuple(half(w - o), ((v - o) ^ (w - o)), (w - o).norm());     });   }   const int N = 1515;   int n;   int Ans[N];   int Sub[N];   vector<point> pts;   vector<int> Tree[N];   int DFS(int u, int p) {     Sub[u] = 1;     for (auto v : Tree[u])       if (v != p) Sub[u] += DFS(v, u);     return Sub[u];   }   void PaintTree(int u, int p, int L, int R) {     int idx = L;     for (int i = L; i <= R; i++)       if (pts[idx].y < pts[i].y) idx = i;     swap(pts[L], pts[idx]);     Ans[pts[L].index] = u;     polarSort(pts[L], pts, L + 1, R + 1);     int pre = 0;     for (auto v : Tree[u])       if (v != p) {         PaintTree(v, u, L + pre + 1, L + pre + Sub[v]);         pre += Sub[v];       }   }   int main() {     scanf( %d , &n);     for (int i = 1; i < n; i++) {       int u, v;       scanf( %d%d , &u, &v);       Tree[u].push_back(v);       Tree[v].push_back(u);     }     for (int i = 0; i < n; i++) {       int x, y;       scanf( %d%d , &x, &y);       pts.push_back(point(x, y, i + 1));     }     DFS(1, 0);     PaintTree(1, 0, 0, n - 1);     for (int i = 1; i <= n; i++) printf( %d  , Ans[i]);     puts(  );     return 0;   }   