#include <bits/stdc++.h>
using namespace std;
template <typename T>
void in(T &x) {
  T c = getchar();
  while (((c < 48) || (c > 57)) && (c != '-')) c = getchar();
  bool neg = false;
  if (c == '-') neg = true;
  x = 0;
  for (; c < 48 || c > 57; c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) x = (x * 10) + (c - 48);
  if (neg) x = -x;
}
const int MAXN = 2e5 + 100;
int n;
struct Point {
  long long x, y;
  bool operator<(const Point &other) const {
    return x == other.x ? y > other.y : x > other.x;
  }
};
long long Cross(const Point &o, const Point &a, const Point &b) {
  return (o.x - a.x) * (o.y - b.y) * (b.x * a.y) -
         (o.x - b.x) * (o.y - a.y) * (a.x * b.y);
}
map<pair<long long, long long>, vector<int> > cmp;
int main() {
  in(n);
  for (int i = 0; i < n; i++) {
    long long a, b;
    in(a), in(b);
    cmp[{a, b}].push_back(i + 1);
  }
  vector<Point> arr;
  for (auto &elem : cmp) {
    arr.push_back({elem.first.first, elem.first.second});
  }
  sort(arr.begin(), arr.end());
  vector<Point> hull;
  for (auto &curr : arr) {
    while (hull.size() > 1 &&
           Cross(hull[hull.size() - 2], hull[hull.size() - 1], curr) < 0) {
      hull.pop_back();
    }
    hull.push_back(curr);
  }
  vector<int> ans;
  vector<pair<int, int> > pts;
  pts.push_back({hull.front().x, hull.front().y});
  for (int i = 0; i + 1 < hull.size(); i++) {
    Point &curr = hull[i], &nxt = hull[i + 1];
    if (curr.x != nxt.x && curr.y < nxt.y) {
      pts.push_back({curr.x, curr.y});
      pts.push_back({nxt.x, nxt.y});
    } else
      break;
  }
  for (auto &p : pts) {
    for (int id : cmp[p]) {
      ans.push_back(id);
    }
  }
  sort(ans.begin(), ans.end());
  ans.resize(unique(ans.begin(), ans.end()) - ans.begin());
  for (auto &elem : ans) {
    printf("%d ", elem);
  }
  puts("");
  return 0;
}
