Tavas is a cheerleader in the new sports competition named "Pashmaks".

<image>

This competition consists of two part: swimming and then running. People will immediately start running R meters after they finished swimming exactly S meters. A winner is a such person that nobody else finishes running before him/her (there may be more than one winner).

Before the match starts, Tavas knows that there are n competitors registered for the match. Also, he knows that i-th person's swimming speed is si meters per second and his/her running speed is ri meters per second. Unfortunately, he doesn't know the values of R and S, but he knows that they are real numbers greater than 0.

As a cheerleader, Tavas wants to know who to cheer up. So, he wants to know all people that might win. We consider a competitor might win if and only if there are some values of R and S such that with these values, (s)he will be a winner.

Tavas isn't really familiar with programming, so he asked you to help him.

Input

The first line of input contains a single integer n (1 ≤ n ≤ 2 × 105).

The next n lines contain the details of competitors. i-th line contains two integers si and ri (1 ≤ si, ri ≤ 104).

Output

In the first and the only line of output, print a sequence of numbers of possible winners in increasing order.

Examples

Input

3
1 3
2 2
3 1


Output

1 2 3 


Input

3
1 2
1 1
2 1


Output

1 3 
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 11;
const double eps = 1e-15;
const double inf = 1e9;
struct Tpoint {
  double x, y;
  Tpoint() {}
  Tpoint(double x_, double y_) { x = x_, y = y_; }
};
Tpoint operator-(const Tpoint &a, const Tpoint &b) {
  return Tpoint(a.x - b.x, a.y - b.y);
}
Tpoint operator+(const Tpoint &a, const Tpoint &b) {
  return Tpoint(a.x + b.x, a.y + b.y);
}
Tpoint operator/(const Tpoint &a, double k) { return Tpoint(a.x / k, a.y / k); }
Tpoint operator*(const Tpoint &a, double k) { return Tpoint(a.x * k, a.y * k); }
inline double dot(const Tpoint &a, const Tpoint &b) {
  return a.x * b.x + a.y * b.y;
}
inline double cross(const Tpoint &a, const Tpoint &b) {
  return a.x * b.y - a.y * b.x;
}
inline int sgn(double x) {
  if (x < -eps) return -1;
  return x > eps;
}
struct Tline {
  double A, B, C, ang;
  int tmp;
  Tpoint pt;
  bool operator<(const Tline b) const {
    if (A != b.A) return A < b.A;
    if (B != b.B) return B < b.B;
    return C < b.C;
  }
  bool include(Tpoint k) { return sgn(dot(k - pt, Tpoint(A, B))) >= 0; }
};
inline Tpoint crosspoint(Tline a, Tline b) {
  double v1 = (b.C * a.B - a.C * b.B);
  double v2 = (b.C * a.A - a.C * b.A);
  double v0 = (a.A * b.B - b.A * a.B);
  return Tpoint(v1 / v0, -v2 / v0);
}
Tline s[maxn];
int sn, n;
inline bool cmp_ang(Tline a, Tline b) {
  return a.ang < b.ang || (a.ang == b.ang && a.C < b.C);
}
Tline h[maxn];
bool ok[maxn];
map<Tline, int> cc;
bool check() {
  int l = 1, r = 0;
  int add = 0;
  for (int i = 1; i <= sn; i++) {
    if (i > 1 && (!sgn(s[i].ang - s[i - 1].ang))) continue;
    while (l < r && !s[i].include(crosspoint(h[r], h[r - 1]))) r--;
    while (l < r && !s[i].include(crosspoint(h[l], h[l + 1]))) l++;
    h[++r] = s[i];
  }
  while (l < r && !h[l].include(crosspoint(h[r], h[r - 1]))) r--;
  while (l < r && !h[r].include(crosspoint(h[l], h[l + 1]))) l++;
  for (int i = l; i <= r; i++) {
    ok[h[i].tmp] = 1;
    cc[h[i]] = 1;
  }
  return r - l + 1 >= 3;
}
int zz[maxn], aa[maxn], bb[maxn];
Tline ttt[maxn];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    aa[i] = a, bb[i] = b;
    s[i] = {1.0 / a, -1, 1.0 / b, 0, i, {0, 1.0 / b}};
  }
  s[n + 1] = {1, 0, 0.00001, 0, 0, {0.00001, 0}};
  s[n + 2] = {0, 1, 0.00001, 0, 0, {0, 0.00001}};
  s[n + 3] = {-1, 0, -inf, 0, 0, {inf, 0}};
  sn = n + 3;
  for (int i = 1; i <= sn; i++) {
    s[i].ang = atan2(s[i].B, s[i].A);
    ttt[i] = s[i];
  }
  sort(s + 1, s + sn + 1, cmp_ang);
  check();
  for (int i = 1; i <= n; i++) {
    if (cc[ttt[i]]) printf("%d ", i);
  }
  puts("");
  return 0;
}
