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 N = 1000001;
const double Eps = 1e-12;
struct Point {
  double x, y;
  Point(double _x = 0, double _y = 0) { x = _x, y = _y; }
};
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
double operator*(Point A, Point B) { return A.x * B.y - A.y * B.x; }
bool operator==(Point A, Point B) { return A.x == B.x & A.y == B.y; }
int dcmp(double v) {
  if (fabs(v) < Eps) return 0;
  return v > 0 ? 1 : -1;
}
struct Line {
  Point a, b;
  double an;
  int num;
  Line(Point _a = 0, Point _b = 0, double _an = 0, int _num = 0) {
    a = _a, b = _b, an = _an, num = _num;
  }
};
bool operator==(Line A, Line B) { return A.a == B.a & A.b == B.b; }
Line c[N], q[N], s[N];
int top(0);
bool be[N];
bool cmp2(Line A, Line B) { return A.num < B.num; }
bool cmp1(Line A, Line B) {
  if (!dcmp(A.an - B.an)) return dcmp((B.b - A.a) * (B.a - A.a)) > 0;
  return A.an < B.an;
}
Point Cross(Line A, Line B) {
  double ts = (B.b - B.a) * (A.a - B.a) / ((A.b - A.a) * (B.b - B.a));
  return Point(A.a.x + ts * (A.b.x - A.a.x), A.a.y + ts * (A.b.y - A.a.y));
}
bool Check(Line A, Line B, Line C) {
  Point now = Cross(A, B);
  return dcmp((C.b - now) * (C.a - now)) > 0;
}
int main() {
  int n;
  register int i;
  double Ra, Rb;
  scanf("%d", &n);
  for (i = 1; i <= n; ++i) {
    c[i].num = i;
    scanf("%lf%lf", &Ra, &Rb);
    c[i].a = Point(-Rb, 2 * Ra - Rb);
    c[i].b = Point(Rb, Rb);
    c[i].an = atan2((c[i].b.y - c[i].a.y), (c[i].b.x - c[i].a.x));
  }
  c[++n] = Line(Point(Eps, 1), Point(Eps, 0), 0, 0);
  c[n].an = atan2((c[n].b.y - c[n].a.y), (c[n].b.x - c[n].a.x));
  c[++n] = Line(Point(0, 0), Point(1, 1 + Eps), 0, 0);
  c[n].an = atan2((c[n].b.y - c[n].a.y), (c[n].b.x - c[n].a.x));
  sort(c + 1, c + n + 1, cmp1);
  int k = 0;
  c[0].an = 0;
  for (i = 1; i <= n; ++i) {
    if (c[i].an != c[i - 1].an) ++k;
    s[k] = c[i];
  }
  q[++top] = s[1], q[++top] = s[2];
  for (i = 1; i <= k; ++i)
    if (i > 2) {
      for (; top > 1 & Check(q[top], q[top - 1], s[i]); top--)
        ;
      q[++top] = s[i];
    }
  for (i = 1; i <= top; ++i) be[q[i].num] = 1;
  for (i = n - 1; i >= 1; --i)
    if (be[c[i + 1].num] & c[i] == c[i + 1]) be[c[i].num] = 1;
  for (i = 1; i <= n; ++i)
    if (be[i]) printf("%d ", i);
  return 0;
}
