#include #include #include #include #include using namespace std; typedef long long ll; bool will_intersect(pair& p, pair& q) { return p.second != q.second; } pair intersect_y(pair& p, pair& q) { return make_pair(q.first - p.first, p.second - q.second); } bool gt(const pair& a, const pair& b) { return a.first * b.second > a.second * b.first; } int main() { int n; cin >> n; vector > d(n); vector prev(n), next(n); int c, m; for (int i = 0; i < n; ++i) { cin >> c >> m; d[i] = make_pair(c, m); } set alive; for (int i = 0; i < n; ++i) { prev[i] = i - 1; next[i] = i + 1; } next[n - 1] = -1; auto cmp = [](const pair, pair>& a, const pair, pair>& b) { return gt(a.second, b.second); }; priority_queue< pair, pair>, vector, pair>>, decltype(cmp)> collisions(cmp); set dead; for (int i = 1; i < n; ++i) { if (will_intersect(d[i-1], d[i])) { collisions.push(make_pair(make_pair(i-1, i), intersect_y(d[i-1], d[i]))); } } while(!collisions.empty()) { auto coll = collisions.top(); collisions.pop(); pair drones = coll.first; if (dead.count(drones.first) || dead.count(drones.second)) continue; dead.insert(drones.first); dead.insert(drones.second); int next_d = next[drones.second], prev_d = prev[drones.first]; if (next_d >= 0) { prev[next_d] = prev_d; } if (prev_d >= 0) { next[prev_d] = next_d; } if (prev_d >= 0 && next_d >= 0) { if (will_intersect(d[prev_d], d[next_d])) { collisions.push(make_pair(make_pair(prev_d, next_d), intersect_y(d[prev_d], d[next_d]))); } } } cout << n - dead.size() << '\n'; for (int i = 0; i < n; ++i) { if (!dead.count(i)) { cout << i + 1 << ' '; } } cout << '\n'; }