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 {
char ibuf[(1 << 21) + 1], obuf[(1 << 21) + 1], st[15], *iS, *iT,
    *oS = obuf, *oT = obuf + (1 << 21);
inline char Get() {
  return (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, (1 << 21) + 1, stdin),
                      (iS == iT ? EOF : *iS++))
                   : *iS++);
}
inline void Flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
inline void Put(register char x) {
  *oS++ = x;
  if (oS == oT) Flush();
}
inline int read() {
  register int x = 0;
  register char ch = Get();
  while (ch > '9' || ch < '0') ch = Get();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + (ch ^ 48), ch = Get();
  return x;
}
inline void write(register int x) {
  register int top = 0;
  while (x) st[++top] = (x % 10) + 48, x /= 10;
  while (top) Put(st[top--]);
  Put(' ');
}
}  // namespace IO
using namespace IO;
const int N = 3e5 + 1;
struct node {
  int x, y, id;
  inline bool operator<(node a) const {
    return x > a.x || (x == a.x && y > a.y);
  }
} a[N];
inline double Slope(node a, node b) {
  return (double)a.x * b.x * (b.y - a.y) / ((double)a.y * b.y * (b.x - a.x));
}
int q[N], Next[N], v[N];
double k[N];
int main() {
  register int n = read(), px, py = 0, tl;
  for (register int i = 1; i <= n; ++i) {
    a[i].x = read(), a[i].y = read(), a[i].id = i;
    if (py < a[i].y || (py == a[i].y && px < a[i].x)) py = a[i].y, px = a[i].x;
  }
  sort(a + 1, a + n + 1);
  q[tl = 1] = 1;
  for (register int i = 2; i <= n && px <= a[i].x; ++i) {
    if (a[q[tl]].x == a[i].x) {
      if (a[q[tl]].y == a[i].y)
        Next[a[i].id] = Next[a[q[tl]].id], Next[a[q[tl]].id] = a[i].id;
      continue;
    }
    while (tl > 1 && k[tl] > Slope(a[q[tl]], a[i])) --tl;
    q[++tl] = i, k[tl] = Slope(a[q[tl - 1]], a[i]);
  }
  for (; tl; --tl)
    for (register int i = a[q[tl]].id; i; i = Next[i]) v[i] = 1;
  for (register int i = 1; i <= n; ++i)
    if (v[i]) write(i);
  return Flush(), 0;
}
