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 double eps = 1e-11;
inline int dcmp(double x) { return (x > eps) - (x < -eps); }
inline int dcmp(double A, double B) { return dcmp(A - B); }
int n;
int I[200010];
bool flag[200010];
map<pair<int, int>, int> mp;
class line {
 public:
  double A, B;
  int id;
  bool operator<(const line &t) const {
    if (dcmp(A, t.A) == 0) return B < t.B;
    return A < t.A;
  }
} l[200010], stk[200010];
inline double intersect(const line &A, const line &B) {
  return (A.B - B.B) / (B.A - A.A);
}
double pt[200010];
int main() {
  scanf("%d", &n);
  int cnt = 0;
  for (int i = 1, ti, tj; i <= n; i++) {
    scanf("%d%d", &ti, &tj);
    if (mp.find(make_pair(ti, tj)) != mp.end()) {
      I[i] = mp[make_pair(ti, tj)];
      continue;
    }
    l[++cnt].A = (double)(tj - ti) / (ti * tj);
    l[cnt].B = (double)1 / tj;
    l[cnt].id = cnt;
    mp[make_pair(ti, tj)] = cnt;
    I[i] = cnt;
  }
  sort(l + 1, l + cnt + 1);
  int top = 0;
  for (int i = 1; i <= cnt; i++) {
    if (i != 1 && dcmp(l[i].A, l[i - 1].A) == 0) continue;
    while (top >= 2 && dcmp(intersect(stk[top], stk[top - 1]),
                            intersect(l[i], stk[top])) == -1)
      top--;
    stk[++top] = l[i];
  }
  pt[0] = 1e10;
  for (int i = 1; i < top; i++) pt[i] = intersect(stk[i], stk[i + 1]);
  pt[top] = -1e10;
  for (int i = 1; i <= top; i++)
    if (!(dcmp(pt[i - 1], 0) != 1 || dcmp(pt[i], 1) != -1)) flag[stk[i].id] = 1;
  for (int i = 1; i <= n; i++)
    if (flag[I[i]]) printf("%d ", i);
  return 0;
}
