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;
struct Point {
  long long x, y;
  int cid;
  bool okay;
};
bool cmp(Point &a, Point &b) {
  if (a.x == b.x) return a.y < b.y;
  return a.x > b.x;
}
bool getCross(Point &O, Point &A, Point &B) {
  return (O.x - A.x) * (O.y - B.y) * A.y * B.x <
         (O.x - B.x) * (O.y - A.y) * A.x * B.y;
}
Point A[200000];
vector<int> hull;
int lower[200000];
int upper[200000];
bool winner[200000];
int equaltonext[200000];
int N;
void getHull() {
  if (N == 1) {
    hull.push_back(0);
    return;
  }
  sort(A, A + N, cmp);
  int c = 0;
  for (int i = 0; i < N; i++) {
    if ((i < (N - 1)) && (A[i].x == A[i + 1].x) && (A[i].y < A[i + 1].y))
      continue;
    if ((i < (N - 1)) && (A[i].x == A[i + 1].x) && (A[i].y == A[i + 1].y)) {
      equaltonext[i] = 1;
      continue;
    }
    while ((c >= 2) && (getCross(A[lower[c - 2]], A[lower[c - 1]], A[i]))) c--;
    lower[c++] = i;
  }
  A[lower[0]].okay = 1;
  for (int i = 1; i < c; i++) {
    A[lower[i]].okay = (A[lower[i]].y > A[lower[i - 1]].y);
  }
  for (int i = (N - 1); i >= 0; i--)
    A[i].okay = (A[i].okay || (equaltonext[i] && A[i + 1].okay));
  for (int i = 0; i < N; i++) winner[A[i].cid] = A[i].okay;
}
int main() {
  cin >> N;
  int a, b;
  for (int i = 0; i < N; i++) {
    cin >> a >> b;
    A[i].x = a;
    A[i].y = b;
    A[i].cid = i;
    equaltonext[i] = 0;
  }
  if (N == 1) {
    cout << 1 << "\n";
    return 0;
  }
  getHull();
  for (int i = 0; i < N; i++)
    if (winner[i]) cout << i + 1 << " ";
  cout << "\n";
  return 0;
}
