#include <bits/stdc++.h>
using namespace std;
inline long long max(long long x, long long y) { return x > y ? x : y; }
inline long long min(long long x, long long y) { return x < y ? x : y; }
inline void ckmin(long long &x, long long y) {
  x = x < y ? x : y;
  return;
}
inline void ckmax(long long &x, long long y) {
  x = x > y ? x : y;
  return;
}
inline long long gcd(long long n, long long m) { return m ? gcd(m, n % m) : n; }
inline long long lcm(long long x, long long y) { return x / gcd(x, y) * y; }
inline void swap(long long &x, long long &y) {
  long long t = x;
  x = y;
  y = t;
  return;
}
namespace yspm {
inline long long read() {
  long long res = 0, f = 1;
  char k;
  while (!isdigit(k = getchar()))
    if (k == '-') f = -1;
  while (isdigit(k)) res = res * 10 + k - '0', k = getchar();
  return res * f;
}
char OPUT[100];
inline void print(long long x) {
  if (!x) return putchar('0'), putchar(' '), void();
  if (x < 0) putchar('-'), x = -x;
  long long cnt = 0;
  while (x) OPUT[++cnt] = x % 10, x /= 10;
  for (register long long i = cnt; i >= 1; --i) putchar(OPUT[i] + '0');
  putchar(' ');
  return;
}
const long long N = 6e5 + 10;
struct node {
  long long x, y;
  long long id;
  node() {}
  node(long long xx, long long yy) {
    x = xx;
    y = yy;
    return;
  }
  node operator+(const node &a) const { return node(x + a.x, y + a.y); }
  node operator-(const node &a) const { return node(x - a.x, y - a.y); }
} a[N], con[N];
long long bel[N];
inline bool cmpx(node p, node q) {
  if (p.x == q.x && p.y == q.y) return p.id < q.id;
  if (p.x == q.x) return p.y > q.y;
  return p.x > q.x;
}
inline long double cross(node a, node b) { return a.x * b.y - a.y * b.x; }
long long st[N], top, n, vis[N], b[N], nds, CC;
vector<long long> ans;
struct BIT {
  long long c[N];
  inline void insert(long long x) {
    for (; x <= CC; x += x & (-x)) c[x]++;
  }
  inline long long query(long long x) {
    long long res = 0;
    for (; x; x -= x & (-x)) res += c[x];
    return res;
  }
} T;
signed main() {
  n = read();
  for (register long long i = 1; i <= n; ++i)
    a[i].x = read(), a[i].y = read(), a[i].id = i, b[++CC] = a[i].y, bel[i] = i;
  sort(a + 1, a + n + 1, cmpx);
  sort(b + 1, b + CC + 1);
  CC = unique(b + 1, b + CC + 1) - b - 1;
  for (register long long i = 1; i <= n; ++i) {
    long long ps = lower_bound(b + 1, b + CC + 1, a[i].y) - b;
    if (T.query(CC) == T.query(ps)) a[++nds] = a[i];
    T.insert(ps);
  }
  for (register long long i = 1; i <= nds; ++i) {
    if (i > 1) {
      if (a[i].x == a[i - 1].x && a[i].y == a[i - 1].y) {
        bel[a[i].id] = bel[a[i - 1].id];
        continue;
      }
      if (a[i].y <= a[i - 1].y) continue;
    }
    while (top > 1) {
      long double lhs =
          1.0 * a[st[top - 1]].x * a[st[top]].x * a[st[top - 1]].y / a[i].x +
          1.0 * a[st[top]].y * a[st[top - 1]].x -
          1.0 * a[st[top - 1]].x * a[st[top]].x * a[st[top]].y / a[i].x;
      long double rhs =
          1.0 * a[st[top - 1]].x * a[st[top]].y * a[st[top - 1]].y / a[i].y +
          1.0 * a[st[top - 1]].y * a[st[top]].x -
          1.0 * a[st[top]].x * a[st[top - 1]].y * a[st[top]].y / a[i].y;
      if (lhs > rhs)
        --top;
      else
        break;
    }
    st[++top] = i;
  }
  for (register long long i = 1; i <= top; ++i) vis[a[st[i]].id] = 1;
  for (register long long i = 1; i <= n; ++i)
    if (vis[i] || vis[bel[i]]) ans.push_back(i);
  for (auto p : ans) print(p);
  puts("");
  return 0;
}
}  // namespace yspm
signed main() { return yspm::main(); }
