#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 50, mod = 1e9 + 7;
struct PT {
  long long x, y;
  PT() : x(0), y(0) {}
  PT(double x, double y) : x(x), y(y) {}
  PT(const PT &p) : x(p.x), y(p.y) {}
  PT operator+(const PT &p) const { return PT(x + p.x, y + p.y); }
  PT operator-(const PT &p) const { return PT(x - p.x, y - p.y); }
  PT operator*(double c) const { return PT(x * c, y * c); }
  bool operator<(const PT &p) const {
    return make_pair(x, y) < make_pair(p.x, p.y);
  }
  bool operator==(const PT &p) const {
    return make_pair(x, y) == make_pair(p.x, p.y);
  }
};
inline long long CROSS(PT o, PT a, PT b) {
  return (a.y * b.x * o.x * o.y - a.y * o.x * b.x * b.y -
          o.y * b.x * a.x * a.y + a.x * b.x * a.y * b.y) -
         (a.x * b.y * o.x * o.y - a.x * o.y * b.x * b.y -
          o.x * b.y * a.x * a.y + a.x * b.x * a.y * b.y);
}
void upperHull(vector<PT> &poly) {
  sort(poly.begin(), poly.end());
  poly.erase(unique(poly.begin(), poly.end()), poly.end());
  vector<PT> res;
  for (int i = (int)poly.size() - 1; i >= 0; i--) {
    while ((int)res.size() > 1 &&
           CROSS(res[res.size() - 2], res[res.size() - 1], poly[i]) < 0)
      res.pop_back();
    res.push_back(poly[i]);
  }
  poly = res;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  vector<PT> v;
  map<PT, vector<int> > mp;
  cin >> n;
  for (int i = 0; i < n; i++) {
    int x, y;
    cin >> x >> y;
    v.emplace_back(x, y);
    mp[PT(x, y)].push_back(i);
  }
  upperHull(v);
  while (v.size() > 1 && v[v.size() - 2].y >= v[v.size() - 1].y &&
         v[v.size() - 2].x >= v[v.size() - 1].x)
    v.pop_back();
  vector<int> idx;
  for (auto i : v)
    for (auto j : mp[i]) idx.push_back(j + 1);
  sort(idx.begin(), idx.end());
  for (auto i : idx) cout << i << " ";
}
