#include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) template struct Point { typedef Point P; T x, y; explicit Point(T x=0, T y=0) : x(x), y(y) {} bool operator<(P p) const { return tie(x,y) < tie(p.x,p.y); } bool operator==(P p) const { return tie(x,y) == tie(p.x,p.y); } T cross(P p) const {return x*p.y - y*p.x; } T cross(P a, P b) const {return (a-*this).cross(b-*this);} P operator+(P p) const {return P(x+p.x, y+p.y);} P operator-(P p) const {return P(x-p.x, y-p.y);} }; typedef Point P; pair, vector> ulHull(const vector

& S) { vector Q(S.size()), U, L; iota(Q.begin(), Q.end(), 0); sort(Q.begin(), Q.end(), [&S](int a, int b){return S[a] < S[b];}); for (auto& it : Q) { #define ADDP(C, cmp) while(C.size() > 1 && S[C[C.size()-2]].cross(\ S[it], S[C.back()]) cmp 0) C.pop_back(); C.push_back(it); ADDP(U, <=); ADDP(L, >=); } return {U, L}; } vector convexHull(const vector

& S) { vector u, l; tie(u, l) = ulHull(S); if (S.size() <= 1) return u; if (S[u[0]] == S[u[1]]) return {0}; l.insert(l.end(), u.rbegin()+1, u.rend()-1); return l; } int main(void) { ios_base::sync_with_stdio(false); int n; cin >> n; vector

a; rep(i,0,n) { ll x, y; cin >> x >> y; a.emplace_back(x, y); } auto hull = convexHull(a); vector onhull(n, 0); for(auto x : hull) { onhull[x] = true; } int best = -1; rep(i,0,n) { if (onhull[i]) { best = i; break; } } vector bya(n); rep(i,0,n) bya[i] = i; swap(bya[best], bya[n-1]); bya.pop_back(); sort(bya.begin(), bya.end(), [&](int ia, int ib) { return a[best].cross(a[ia], a[ib]) < 0; }); // cout << best << endl; //for(auto x : bya) cout << x << " "; cout << endl; if (hull.size() == n) { cout << 3 << " " << (n-2) << " " << (n) << endl; } else { int res = n; rep(i,0,bya.size()) { if (!onhull[bya[i]]) { continue; } bool ok = false; if(i>0 && !onhull[bya[i-1]]) { ok = true; } if(i