func_code_string: #include <bits/stdc++.h>   using namespace std;   struct point {     int x, y, i;     long long dx, dy;   };   vector<vector<int> > e;   vector<int> sz;   vector<int> ans;   vector<point> pt;   int dfs(int s) {     sz[s] = 1;     for (int i = 0; i < e[s].size(); i++)       if (sz[e[s][i]] == 0) sz[s] += dfs(e[s][i]);     return sz[s];   }   bool cmp(const point &p1, const point &p2) {     return (p1.dx * p2.dy - p1.dy * p2.dx) < 0;   }   void go(int begin, int end, int s) {     for (int i = begin + 1; i < end; i++)       if (make_pair(pt[i].x, pt[i].y) < make_pair(pt[begin].x, pt[begin].y))         swap(pt[begin], pt[i]);     for (int i = begin; i < end; i++) {       pt[i].dx = pt[i].x - pt[begin].x;       pt[i].dy = pt[i].y - pt[begin].y;     }     sort(pt.begin() + begin + 1, pt.begin() + end, cmp);     ans[pt[begin].i] = s + 1;     for (int i = 0, k = begin + 1; i < e[s].size(); i++) {       int v = e[s][i];       if (sz[v] < sz[s]) {         go(k, k + sz[v], v);         k += sz[v];       }     }   }   int main(int argc, char *argv[]) {     int n;     cin >> n;     e.resize(n);     for (int i = 0; i < n - 1; i++) {       int u, v;       cin >> u >> v;       u--, v--;       e[u].push_back(v);       e[v].push_back(u);     }     pt.resize(n);     for (int i = 0; i < n; i++) {       cin >> pt[i].x >> pt[i].y;       pt[i].i = i;     }     sz.assign(n, 0);     dfs(0);     ans.assign(n, -1);     go(0, n, 0);     for (int i = 0; i < n; i++) cout << (i ?     :   ) << ans[i];     cout << endl;     return 0;   }   