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;
int n;
struct point {
  point() : x(0), y(0) {}
  point(int x, int y) : x(x), y(y) {}
  int x, y;
  bool operator<(const point &rhs) const {
    return make_pair(-x, -y) < make_pair(-rhs.x, -rhs.y);
  }
};
long long ccw(const point &a, const point &b, const point &c) {
  long long x1 = b.x - a.x, y1 = b.y - a.y;
  long long x2 = c.x - a.x, y2 = c.y - a.y;
  return c.x * b.y * x1 * y2 - b.x * c.y * x2 * y1;
}
int main() {
  scanf("%d", &n);
  vector<point> dat;
  set<point> un;
  int maxy = 0;
  for (int i = 0; i < n; i++) {
    point p;
    int x, y;
    scanf("%d%d", &x, &y);
    p.x = x;
    p.y = y;
    un.insert(p);
    dat.push_back(p);
    maxy = max(maxy, y);
  }
  vector<point> cv;
  for (auto val : un) {
    while (cv.size() >= 2 &&
           ccw(cv[cv.size() - 2], cv[cv.size() - 1], val) < 0) {
      cv.pop_back();
    }
    cv.push_back(val);
  }
  vector<int> ans;
  set<pair<int, int>> possible;
  for (int i = 0; i < cv.size(); i++) {
    possible.insert(make_pair(cv[i].x, cv[i].y));
    if (cv[i].y == maxy) break;
  }
  for (int i = 0; i < n; i++) {
    if (possible.count(make_pair(dat[i].x, dat[i].y))) {
      ans.push_back(i);
    }
  }
  for (int i = 0; i < ans.size(); i++) {
    printf("%d%c", ans[i] + 1, " \n"[i + 1 == ans.size()]);
  }
  return 0;
}
