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 = 3e5 + 10;
struct CUN {
  int x, y, pos;
} use[N];
int n, tot, top;
int neet[N], sta[N];
double k[N];
bool vis[N];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return (f) ? x : (-x);
}
inline int my(CUN a, CUN b) {
  if (a.x != b.x) return a.x > b.x;
  return a.y > b.y;
}
inline double gett(int ax, int ay, int bx, int by) {
  return ((double)ax * bx * (by - ay)) / ((double)ay * by * (bx - ax));
}
inline double suan(CUN &a, CUN &b) {
  return ((double)a.x * b.x * (b.y - a.y)) / ((double)a.y * b.y * (b.x - a.x));
}
signed main() {
  n = read();
  int nx, ny = 0;
  for (register int i = 1; i <= n; i++) {
    use[i].x = read();
    use[i].y = read();
    use[i].pos = i;
    if (use[i].y > ny || ((use[i].y == ny) && (nx < use[i].x))) {
      ny = use[i].y;
      nx = use[i].x;
    }
  }
  sort(use + 1, use + n + 1, my);
  top = 1;
  sta[top] = 1;
  for (register int i = 2; (i <= n) && (use[i].x >= nx); i++) {
    if (use[i].x == use[sta[top]].x) {
      if (use[i].y == use[sta[top]].y) {
        neet[use[i].pos] = neet[use[sta[top]].pos];
        neet[use[sta[top]].pos] = use[i].pos;
      }
      continue;
    }
    while ((top > 1) && (k[top] > gett(use[sta[top]].x, use[sta[top]].y,
                                       use[i].x, use[i].y)))
      --top;
    sta[++top] = i;
    k[top] = gett(use[sta[top - 1]].x, use[sta[top - 1]].y, use[i].x, use[i].y);
  }
  while (top) {
    for (register int i = use[sta[top]].pos; i; i = neet[i]) vis[i] = 1;
    --top;
  }
  for (register int i = 1; i <= n; i++)
    if (vis[i]) printf("%d ", i);
  printf("\n");
}
