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 INF = (1LL << 30) - 1;
const long long int LINF = (1LL << 62) - 1;
const int NMAX = (2e5) + 5;
struct point {
  double x, y;
  int s, r;
  point() {
    x = y = 0.0;
    s = r = 0;
  }
  point(int _s, int _r) {
    s = _s;
    r = _r;
    x = 1.0 / s;
    y = 1.0 / r;
  }
  bool operator<(const point &that) const {
    if (s == that.s) return r > that.r;
    return s > that.s;
  }
};
int N, top, cnt;
point P[NMAX];
point H[NMAX];
int V[NMAX];
map<pair<int, int>, vector<int> > mp;
long long int cp(const point &A, const point &B, const point &C) {
  return B.s * 1LL * A.r * (C.s - A.s) * (C.r - B.r) -
         A.s * 1LL * B.r * (C.s - B.s) * (C.r - A.r);
}
bool compare(const point &A, const point &B, const point &C) {
  long long int p = cp(A, B, C);
  if (p == 0) return (A.x <= B.x && B.x <= C.x);
  return p > 0;
}
struct cmp {
  bool operator()(const point &A, const point &B) const {
    return compare(P[1], A, B);
  }
};
void convex_hull() {
  int i;
  sort(P + 1, P + N + 1);
  sort(P + 2, P + N + 1, cmp());
  for (i = 1; i <= N; i++) {
    while (top > 2 && !compare(H[top - 1], H[top], P[i])) top--;
    H[++top] = P[i];
  }
}
int main() {
  int i, s, r, poz;
  cin.sync_with_stdio(false);
  scanf("%d", &N);
  for (i = 1; i <= N; i++) {
    scanf("%d%d", &s, &r);
    mp[{s, r}].push_back(i);
  }
  N = 0;
  for (auto x : mp) P[++N] = point(x.first.first, x.first.second);
  convex_hull();
  poz = 1;
  for (i = 1; i <= top; i++)
    if ((H[poz].r < H[i].r) || (H[poz].r == H[i].r && H[poz].s < H[i].s) ||
        (H[poz].r == H[i].r && H[poz].s == H[i].s))
      poz = i;
  for (i = 1; i <= poz; i++)
    for (auto x : mp[{H[i].s, H[i].r}]) V[++cnt] = x;
  sort(V + 1, V + cnt + 1);
  for (i = 1; i <= cnt; i++) printf("%d ", V[i]);
  return 0;
}
