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;
long long mod = 1000000007;
struct pt {
  double x, y;
};
bool cmp(pt a, pt b) { return a.x < b.x || a.x == b.x && a.y < b.y; }
bool cw(pt a, pt b, pt c) {
  return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) < 0;
}
bool ccw(pt a, pt b, pt c) {
  return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) > 0;
}
void convex_hull(vector<pt>& a) {
  if (a.size() == 1) return;
  sort(a.begin(), a.end(), &cmp);
  pt p1 = a[0], p2 = a.back();
  vector<pt> up, down;
  up.push_back(p1);
  down.push_back(p1);
  for (size_t i = 1; i < a.size(); ++i) {
    if (i == a.size() - 1 || cw(p1, a[i], p2)) {
      while (up.size() >= 2 && !cw(up[up.size() - 2], up[up.size() - 1], a[i]))
        up.pop_back();
      up.push_back(a[i]);
    }
    if (i == a.size() - 1 || ccw(p1, a[i], p2)) {
      while (down.size() >= 2 &&
             !ccw(down[down.size() - 2], down[down.size() - 1], a[i]))
        down.pop_back();
      down.push_back(a[i]);
    }
  }
  a.clear();
  for (size_t i = 0; i < up.size(); ++i) a.push_back(up[i]);
  for (size_t i = down.size() - 2; i > 0; --i) a.push_back(down[i]);
}
int main() {
  int n;
  cin >> n;
  vector<pt> ch;
  std::vector<std::pair<int, int> > pl;
  map<std::pair<int, int>, int> ans;
  int x, y;
  for (int i = 0; i < n; i++) {
    cin >> x >> y;
    pl.push_back(make_pair(x, y));
    pt a;
    a.x = 1. / (double)(x);
    a.y = 1. / (double)(y);
    ch.push_back(a);
  }
  convex_hull(ch);
  for (int i = 0; i < ch.size(); i++) {
  }
  int l = ch.size();
  double minx = 10;
  int indx, indy;
  double miny = 10;
  for (int i = 0; i < l; i++) {
    if (ch[i].x < minx) {
      minx = ch[i].x;
      indx = i;
    }
    if (ch[i].y < miny) {
      miny = ch[i].y;
      indy = i;
    }
  }
  int t = 0;
  while ((abs((ch[indy].y) - ch[(indy + 1) % l].y) < 0.000000001) &&
         (t < 2 * l)) {
    t++;
    indy = (indy + 1) % l;
  }
  t = 0;
  while ((abs((ch[indx].x) - ch[(indx + l - 1) % l].x) < 0.000000001) &&
         (t < 2 * l)) {
    t++;
    indx = (indx + l - 1) % l;
  }
  int ind = indy;
  ans[make_pair((int)(1. / ch[ind].x + 0.2), (int)(1. / ch[ind].y + 0.2))] = 1;
  while (ind != indx) {
    ind = (ind + 1) % l;
    ans[make_pair((int)(1. / ch[ind].x + 0.2), (int)(1. / ch[ind].y + 0.2))] =
        1;
  }
  for (int i = 0; i < n; i++) {
    if (ans[pl[i]] == 1) cout << (i + 1) << " ";
  }
}
