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;
struct Point {
  long long x, y;
  int o;
  int ind;
  bool operator<(const Point &p) const {
    if (x != p.x) return x < p.x;
    return y < p.y;
  }
};
int n;
Point coor[200005];
vector<int> good;
int ccw(int x, int y, int z) {
  Point a = coor[x];
  Point b = coor[y];
  Point c = coor[z];
  long long dx1n = a.x - b.x;
  long long dx1d = b.x;
  long long dy1n = a.y - b.y;
  long long dy1d = b.y;
  long long dx2n = a.x - c.x;
  long long dx2d = c.x;
  long long dy2n = a.y - c.y;
  long long dy2d = c.y;
  if (dx1n * dy2n * dy1d * dx2d <= dy1n * dx2n * dx1d * dy2d) return 1;
  return -1;
}
stack<int> stk;
int scd() {
  int top = stk.top();
  stk.pop();
  int ans = stk.top();
  stk.push(top);
  return ans;
}
bool isHull[200005];
vector<int> hull;
vector<int> ree[200005];
void andrew() {
  stk.push(good[0]);
  for (int i = (1); i <= (good.size() - 1); i++) {
    while (stk.size() >= 2 && ccw(scd(), stk.top(), good[i]) < 0) {
      stk.pop();
    }
    stk.push(good[i]);
  }
  while (!stk.empty()) {
    isHull[coor[stk.top()].o] = true;
    for (auto u : ree[stk.top()]) {
      isHull[coor[u].o] = true;
    }
    stk.pop();
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < (signed)(n); i++) {
    int second, r;
    cin >> second >> r;
    coor[i].x = second;
    coor[i].y = r;
    coor[i].o = i + 1;
  }
  sort(coor, coor + n);
  int mx = 0;
  int prev = n;
  for (int i = (n - 1); i >= 0; i--) {
    if (coor[i].y > mx) {
      good.push_back(i);
      mx = coor[i].y;
      prev = i;
    }
    if (coor[i].x == coor[prev].x && coor[i].y == mx) {
      ree[prev].push_back(i);
    }
  }
  reverse(good.begin(), good.end());
  andrew();
  for (int i = (1); i <= (n); i++) {
    if (isHull[i]) cout << i << " ";
  }
  return 0;
}
