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 pi = acos(-1.0);
const double eps = 1e-12;
int cmp(double x) {
  if (fabs(x) < eps) return 0;
  if (x > 0)
    return 1;
  else
    return -1;
}
inline double sqr(double x) { return x * x; }
struct point {
  double x, y;
  int pos;
  point() {}
  point(double a, double b) : x(a), y(b) {}
  point(double a, double b, int p) : x(a), y(b), pos(p) {}
  bool operator<(const point &b) const {
    return abs(x - b.x) < eps ? y + eps < b.y : x + eps < b.x;
  }
  bool operator>(const point &b) const { return b < *this; }
  friend point operator+(const point &a, const point &b) {
    return point(a.x + b.x, a.y + b.y);
  }
  friend point operator-(const point &a, const point &b) {
    return point(a.x - b.x, a.y - b.y);
  }
  friend bool operator==(const point &a, const point &b) {
    return cmp(a.x - b.x) == 0 && cmp(a.y - b.y) == 0;
  }
  friend point operator*(const point &a, const double &b) {
    return point(a.x * b, a.y * b);
  }
  friend point operator*(const double &a, const point &b) {
    return point(a * b.x, a * b.y);
  }
  friend point operator/(const point &a, const double b) {
    return point(a.x / b, a.y / b);
  }
  double norm() { return sqrt(sqr(x) + sqr(y)); }
};
double det(const point &a, const point &b) { return a.x * b.y - a.y * b.x; }
double dot(const point &a, const point &b) { return a.x * b.x + a.y * b.y; }
bool cmp2(point a, point b) { return a.pos < b.pos; }
bool vis[200010];
int q[200010];
vector<point> convex_hull(vector<point> a) {
  vector<point> res;
  sort(a.begin(), a.end());
  int l = a.size();
  res.resize(l * 2 + 5);
  int m = 0;
  point b;
  double x;
  for (int i = 0; i < l; i++) {
    b = a[i];
    x = det(res[m - 1] - res[m - 2], a[i] - res[m - 2]);
    if (m > 0 && a[i] == res[m - 1]) {
      q[a[i].pos] = res[m - 1].pos;
      continue;
    }
    if (m > 0 && cmp(a[i].y - res[m - 1].y) >= 0) continue;
    while (m > 1 && cmp(det(res[m - 1] - res[m - 2], a[i] - res[m - 2])) < 0)
      m--, vis[res[m].pos] = false;
    res[m++] = a[i];
    vis[a[i].pos] = true;
  }
  res.resize(m);
  return res;
}
vector<point> ans, p;
int n, x, y;
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &x, &y);
    p.push_back(
        point((double)10000 / (double)x, (double)10000 / (double)y, i + 1));
  }
  ans = convex_hull(p);
  for (int i = 1; i <= n; i++)
    if (vis[i] || vis[q[i]]) printf("%d%c", i, ' ');
  printf("\n");
  return 0;
}
