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;
namespace IO {
const int maxn(1 << 21 | 1);
char ibuf[maxn], *iS, *iT, c;
int f;
inline char Getc() {
  return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin),
                     (iS == iT ? EOF : *iS++))
                  : *iS++;
}
template <class Int>
inline void In(Int &x) {
  for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
  for (x = 0; c >= '0' && c <= '9'; c = Getc())
    x = (x << 1) + (x << 3) + (c ^ 48);
  x *= f;
}
}  // namespace IO
using IO ::In;
const int maxn(3e5 + 5);
int n, vis[maxn], nxt[maxn], q[maxn], tl;
double k[maxn];
struct Point {
  int a, b, id;
  inline bool operator<(Point x) const { return a == x.a ? b > x.b : a > x.a; }
} p[maxn];
inline double Slope(Point x, Point y) {
  return (double)x.a * y.a * (y.b - x.b) / ((double)x.b * y.b * (y.a - x.a));
}
int main() {
  register int i, j;
  register double mxa = 0, mxb = 0;
  In(n);
  for (i = 1; i <= n; ++i) {
    In(p[i].a), In(p[i].b), p[i].id = i;
    if (mxb < p[i].b || (mxb == p[i].b && mxa < p[i].a))
      mxa = p[i].a, mxb = p[i].b;
  }
  sort(p + 1, p + n + 1), q[tl = 1] = 1;
  for (i = 2; i <= n && mxa <= p[i].a; ++i) {
    if (p[q[tl]].a == p[i].a) {
      if (p[q[tl]].b == p[i].b)
        nxt[p[i].id] = nxt[p[q[tl]].id], nxt[p[q[tl]].id] = p[i].id;
      continue;
    }
    while (tl > 1 && k[tl] > Slope(p[q[tl]], p[i])) --tl;
    q[++tl] = i, k[tl] = Slope(p[q[tl - 1]], p[i]);
  }
  for (; tl; --tl)
    for (i = p[q[tl]].id; i; i = nxt[i]) vis[i] = 1;
  for (i = 1; i <= n; ++i)
    if (vis[i]) printf("%d ", i);
  return puts(""), 0;
}
