#include <bits/stdc++.h>
using namespace std;
const int LIM = 200100;
struct point {
  long long x;
  long long y;
  int num;
  point(long long x = 0, long long y = 0) : x(x), y(y){};
  bool operator!=(point const& p) const {
    return (this->x != p.x) && (this->y != p.y);
  }
};
int n;
point s[LIM];
vector<point> down;
bool cmp1(point p1, point p2) {
  if (p1.x != p2.x) return p1.x > p2.x;
  return p1.y > p2.y;
}
bool cmp2(point p1, point p2) {
  if (p1.y != p2.y) return p1.y > p2.y;
  return p1.x > p2.x;
}
long long rotation(point a, point b, point c) {
  return a.y * c.x * (a.x * b.y - a.x * c.y - b.x * b.y + b.x * c.y) -
         a.x * c.y * (a.y * b.x - a.y * c.x - b.y * b.x + b.y * c.x);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> s[i].x >> s[i].y;
    s[i].num = i + 1;
  }
  sort(s, s + n, cmp1);
  point p1 = s[0], p2 = s[n - 1];
  down.push_back(s[0]);
  for (size_t i = 1; i < n; i++) {
    if (i == n - 1 || (rotation(p1, s[i], p2) == 0ll)) {
      while ((down.size() >= 2 &&
              rotation(down[down.size() - 2], down[down.size() - 1], s[i]) <
                  0ll)) {
        down.pop_back();
      }
      down.push_back(s[i]);
      continue;
    }
    if (i == n - 1 || (rotation(p1, s[i], p2) > 0ll)) {
      while ((down.size() >= 2 &&
              rotation(down[down.size() - 2], down[down.size() - 1], s[i]) <=
                  0ll)) {
        down.pop_back();
      }
      down.push_back(s[i]);
    }
  }
  vector<int> ans;
  p1 = s[0];
  sort(s, s + n, cmp2);
  p2 = s[0];
  set<pair<int, int> > need;
  int i = 0;
  while ((down[i].x != p2.x) && (down[i].y != p2.y)) {
    need.insert(make_pair(down[i].x, down[i].y));
    i++;
  }
  need.insert(make_pair(p2.x, p2.y));
  for (int i = 0; i < n; i++) {
    if (need.find(make_pair(s[i].x, s[i].y)) != need.end()) {
      ans.push_back(s[i].num);
    }
  }
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i] << ' ';
  }
}
