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 = 2e5 + 5;
const long double Eps = 1e-22;
struct Vector {
  long double x, y;
  Vector(long double _x = 0, long double _y = 0) : x(_x), y(_y){};
  bool operator<(const Vector &_X) const {
    return x < _X.x || x == _X.x && y < _X.y;
  }
  bool operator==(const Vector &_X) const { return x == _X.x && y == _X.y; }
  Vector operator-(const Vector &_X) const {
    return Vector(x - _X.x, y - _X.y);
  }
} v[N];
long double cross(const Vector &a, const Vector &b) {
  return a.x * b.y - a.y * b.x;
}
long double dot(const Vector &a, const Vector &b) {
  return a.x * b.x + a.y * b.y;
}
int main() {
  ios::sync_with_stdio(0);
  map<Vector, vector<int> > id;
  vector<int> ans;
  int n;
  cin >> n;
  for (int i = 0, x, y; i < n; ++i)
    cin >> x >> y, v[i] = Vector(1. / x, 1. / y), id[v[i]].push_back(i);
  sort(v, v + n, [](const Vector &x, const Vector &y) -> bool {
    return x.y < y.y || x.y == y.y && x.x < y.x;
  });
  n = unique(v, v + n) - v;
  sort(v + 1, v + n, [](const Vector &x, const Vector &y) -> bool {
    long double t = cross(x - v[0], y - v[0]);
    return fabs(t) > Eps ? t > Eps
                         : dot(x - v[0], x - v[0]) > dot(y - v[0], y - v[0]);
  });
  int left = min_element(v, v + n) - v;
  if (left == 0)
    ans = id[v[0]];
  else {
    vector<Vector> hull;
    hull.push_back(v[0]), hull.push_back(v[left]);
    for (int i = left + 1; i < n; ++i) {
      while (hull.size() > 2 &&
             cross(hull[hull.size() - 1] - hull[hull.size() - 2],
                   v[i] - hull[hull.size() - 2]) < Eps)
        hull.pop_back();
      hull.push_back(v[i]);
    }
    for (int i = 0; i < (int)hull.size(); ++i)
      ans.insert(ans.end(), id[hull[i]].begin(), id[hull[i]].end());
  }
  sort(ans.begin(), ans.end());
  for (int i = 0; i < (int)ans.size(); ++i) cout << ans[i] + 1 << ' ';
}
