#include #define FOR(n, a, b) for(int n = (a); n < (b); ++n) #define ALL(x) x.begin(), x.end() #define pb push_back #define st first #define nd second using namespace std; typedef long long ll; typedef pair pint; typedef vector vi; typedef vector vvi; typedef vector vii; typedef tuple ti; typedef vector vti; int n; vector> pts; vvi g; vi dfsord; vi parent; map asgn; inline ll xdif(ti x1, ti x2) { return get<0>(x2) - get<0>(x1); } inline ll ydif(ti x1, ti x2) { return get<1>(x2) - get<1>(x1); } void dfsinit(int v, int p) { for(int n : g[v]) { if(n == p) continue; parent[n] = v; dfsord.pb(n); dfsinit(n, v); } } inline double k(double x) { return x * x; } ti get_next(ti from) { sort(pts.begin(), pts.end(), [&from](ti t1, ti t2) { return xdif(from, t1) * ydif(from, t2) > xdif(from, t2) * ydif(from, t1); }); /*for(auto x : pts) { cout << "(" << get<0>(x) << ", " << get<1>(x) << "), "; } cout << endl;*/ return pts.back(); } void assign_numbers(int k) { for(int n : g[k]) { if(n == parent[k]) continue; ti x = get_next(asgn[k]); pts.pop_back(); asgn[n] = x; assign_numbers(n); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; parent.resize(n); g.resize(n); int x, y; /*for(int i = 0; i < n - 1; i++) { cin >> x >> y; g[x].pb(y); g[y].pb(x); }*/ for(int i = 0; i < n; i++) { cin >> x >> y; pts.pb({x, y, i}); } sort(pts.begin(), pts.end()); ti root = pts.back(); pts.pop_back(); asgn[0] = root; // dfsord.pb(0); // dfsinit(0, -1); parent[0] = -1; //ti st = {0, 10, 0}; //get_next(st); assign_numbers(0); for(int i = 0; i < n; i++) { for(int j : g[i]) { if(j < i) continue; cout << get<2>(asgn[i]) << ' ' << get<2>(asgn[j]) << '\n'; } } return 0; }