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 double A = 1e4;
const double eps = 1e-12;
bool eq(double x, double y) { return fabs(x - y) < eps; }
bool ls(double x, double y) { return x < y && !eq(x, y); }
bool lseq(double x, double y) { return x < y || eq(x, y); }
struct Point {
  int idx;
  double x, y;
  Point() : idx(), x(), y() {}
  Point(double _x, double _y) : idx(-1), x(_x), y(_y) {}
  void scan(int i) {
    idx = i;
    scanf("%lf%lf", &x, &y);
    x = A / x;
    y = A / y;
  }
  Point operator+(Point a) { return Point(x + a.x, y + a.y); }
  Point operator-(Point a) const { return Point(x - a.x, y - a.y); }
  Point operator*(double k) { return Point(x * k, y * k); }
  Point operator/(double k) { return Point(x / k, y / k); }
  double operator%(Point a) { return x * a.x + y * a.y; }
  double operator*(Point a) { return x * a.y - y * a.x; }
  double sqLen() { return *this % *this; }
  bool operator<(const Point &a) const {
    if (!eq(x, a.x)) return x < a.x;
    return ls(y, a.y);
  }
  bool operator==(const Point &a) const { return eq(x, a.x) && eq(y, a.y); }
};
const int N = (int)2e5 + 200;
int n, oldn;
Point a[N];
Point minP;
bool ans[N];
int ans2[N];
bool cmp(const Point &a, const Point &b) {
  Point v = a - minP;
  Point u = b - minP;
  double x = v * u;
  if (!eq(x, 0)) return x > 0;
  return ls(v.sqLen(), u.sqLen());
}
void solve() {
  minP = a[0];
  for (int i = 0; i < n; i++)
    if (a[i] < minP) minP = a[i];
  sort(a, a + n, cmp);
  Point h[N];
  int sz = 1;
  h[0] = a[0];
  for (int i = 1; i < n; i++) {
    while (sz >= 2 && ls(0, (a[i] - h[sz - 1]) * (h[sz - 1] - h[sz - 2]))) sz--;
    h[sz++] = a[i];
  }
  int idx = 1;
  while (idx < sz && ls((h[idx] - h[idx - 1]).y, 0)) idx++;
  for (int i = 0; i < idx; i++) ans[h[i].idx] = 1;
  for (int i = 1; i <= oldn; i++)
    if (ans[i] || (ans2[i] != -1 && ans[ans2[i]])) printf("%d ", i);
  printf("\n");
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) a[i].scan(i + 1);
  sort(a, a + n);
  ans2[a[0].idx] = -1;
  for (int i = 1; i < n; i++) {
    if (a[i] == a[i - 1]) {
      int p = a[i - 1].idx;
      if (ans2[p] == -1)
        ans2[a[i].idx] = p;
      else
        ans2[a[i].idx] = ans2[p];
    } else
      ans2[a[i].idx] = -1;
  }
  oldn = n;
  n = unique(a, a + n) - a;
  solve();
  return 0;
}
