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 MAX = 200100;
struct toc {
  int ind;
  int repx, repy;
} p[MAX];
bool operator<(toc a, toc b) {
  if (a.repx != b.repx) return a.repx > b.repx;
  return a.repy > b.repy;
}
int Ccw(toc a, toc b, toc c) {
  long long tmp =
      (long long)b.repx * c.repx * (a.repy * c.repy - a.repy * b.repy) +
      (long long)a.repx * c.repx * (a.repy * b.repy - b.repy * c.repy) +
      (long long)a.repx * b.repx * (b.repy * c.repy - a.repy * c.repy);
  if (tmp < 0) return -1;
  if (tmp > 0) return 1;
  return 0;
}
int pocx[MAX], pocy[MAX];
map<pair<int, int>, int> M;
int maxx[MAX], maxy[MAX];
int rje[MAX];
int l[MAX], r[MAX];
vector<toc> V;
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &p[i].repx, &p[i].repy);
    pocx[i] = p[i].repx;
    pocy[i] = p[i].repy;
    maxy[p[i].repx] = max(maxy[p[i].repx], p[i].repy);
    maxx[p[i].repy] = max(maxx[p[i].repy], p[i].repx);
    p[i].ind = i;
  }
  sort(p, p + n);
  memset(l, -1, sizeof l);
  for (int i = 0; i < n; i++) {
    if (i && p[i - 1].repx == p[i].repx && p[i - 1].repy == p[i].repy) continue;
    for (; (int)V.size() > 1;) {
      int tmp = Ccw(V[V.size() - 2], V.back(), p[i]);
      if (tmp == -1)
        V.pop_back();
      else if (tmp == 0) {
        l[V.back().ind] = V[V.size() - 2].ind;
        r[V.back().ind] = p[i].ind;
        V.pop_back();
      } else
        break;
    }
    V.push_back(p[i]);
  }
  for (int i = 0; i < (int)V.size(); i++) {
    if (i && V[i].repx <= V[i - 1].repx && V[i].repy <= V[i - 1].repy) break;
    if (maxx[V[i].repy] == V[i].repx && maxy[V[i].repx] == V[i].repy)
      rje[V[i].ind] = 1;
  }
  for (int i = n - 1; i >= 0; i--) {
    int ind = p[i].ind;
    if (!rje[ind] && l[ind] != -1 && rje[l[ind]] && rje[r[ind]] &&
        maxx[p[ind].repy] == p[ind].repx && maxy[p[ind].repx] == p[ind].repy)
      rje[ind] = 1;
  }
  for (int i = 0; i < n; i++)
    if (rje[i]) M[make_pair(pocx[i], pocy[i])] = 1;
  for (int i = 0; i < n; i++)
    if (rje[i] || M[make_pair(pocx[i], pocy[i])]) printf("%d ", i + 1);
  printf("\n");
  return 0;
}
