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 
5
10 50
10 50
10 50
10 50
10 50
 2
10000 10000
10000 10000
 3
10000 10000
10000 10000
10000 10000
 3
1000 3000
1500 1500
3000 1000
 43
75 16
70 7
75 16
54 2
70 7
54 2
70 7
54 2
70 7
54 2
54 2
70 7
70 7
54 2
70 7
75 16
70 7
54 2
54 2
54 2
54 2
54 2
54 2
75 16
70 7
70 7
54 2
70 7
75 16
54 2
75 16
75 16
54 2
54 2
70 7
70 7
75 16
70 7
70 7
70 7
75 16
75 16
54 2
 1
1 1
 2
1 1
1 1
 44
78 52
75 16
70 7
75 16
54 2
70 7
54 2
70 7
54 2
70 7
54 2
54 2
70 7
70 7
54 2
70 7
75 16
70 7
54 2
54 2
54 2
54 2
54 2
54 2
75 16
70 7
70 7
54 2
70 7
75 16
54 2
75 16
75 16
54 2
54 2
70 7
70 7
75 16
70 7
70 7
70 7
75 16
75 16
54 2
 3
1000 3000
1499 1499
3000 1000
 5
50 50
49 50
50 49
49 49
50 1
 18
82 38
33 69
33 69
33 69
33 69
33 69
82 38
33 69
33 69
33 69
82 38
33 69
33 69
82 38
82 38
33 69
33 69
33 69
 1
10000 9999
 3
1000 3000
1501 1501
3000 1000
 2
1 2
2 1

1 2 3 4 5
 1 2
 1 2 3
 1 2 3
 1 3 16 24 29 31 32 37 41 42
 1
 1 2
 1
 1 3
 1
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 1
 1 2 3
 1 2 

#include <bits/stdc++.h>
using namespace std;
struct point {
  int xx, yy;
  double x, y;
  point(double x = 0, double y = 0) {
    this->x = x;
    this->y = y;
  }
  void init(int xx, int yy) {
    this->xx = xx, this->yy = yy;
    x = 1.0 / xx;
    y = 1.0 / yy;
  }
  point operator+(const point& a) const { return point(x + a.x, y + a.y); }
  point operator-(const point& a) const { return point(x - a.x, y - a.y); }
  bool operator==(point& p) { return p.xx == xx && p.yy == yy; }
};
vector<point> a;
vector<point> ch;
vector<point> upper, lower;
double crossProduct(point first, point second, point third) {
  return (second.x - first.x) * (third.y - first.y) -
         (second.y - first.y) * (third.x - first.x);
}
bool leftLower(point first, point second) {
  if (first.x == second.x) return first.y < second.y;
  return first.x < second.x;
}
void convexHull() {
  if (int((a).size()) <= 3) {
    for (int i = (0); i <= (int((a).size()) - 1); i++) ch.push_back(a[i]);
    return;
  }
  sort((a).begin(), (a).end(), leftLower);
  upper.push_back(a[0]);
  upper.push_back(a[1]);
  for (int i = (2); i <= (int((a).size()) - 1); i++) {
    upper.push_back(a[i]);
    while (int((upper).size()) >= 3 &&
           crossProduct(upper[int((upper).size()) - 3],
                        upper[int((upper).size()) - 2],
                        upper[int((upper).size()) - 1]) > 1e-22) {
      upper.erase(upper.end() - 2);
    }
  }
  for (int i = (0); i <= (int((upper).size()) - 1); i++) ch.push_back(upper[i]);
  lower.push_back(a[int((a).size()) - 1]);
  lower.push_back(a[int((a).size()) - 2]);
  for (int i = (int((a).size()) - 3); i >= (0); i--) {
    lower.push_back(a[i]);
    while (int((lower).size()) >= 3 &&
           crossProduct(lower[int((lower).size()) - 3],
                        lower[int((lower).size()) - 2],
                        lower[int((lower).size()) - 1]) > 1e-22) {
      lower.erase(lower.end() - 2);
    }
  }
  for (int i = (1); i <= (int((lower).size()) - 2); i++) ch.push_back(lower[i]);
}
map<pair<int, int>, vector<int> > ma;
vector<int> res;
int n;
point leftMost, downMost;
int main() {
  ios::sync_with_stdio(0);
  cin >> n;
  for (int i = (1); i <= (n); i++) {
    int a, b;
    cin >> a >> b;
    ma[pair<int, int>(a, b)].push_back(i);
  }
  if (int((ma).size()) == 1) {
    for (int i = (1); i <= (n); i++) cout << i << " ";
    return 0;
  }
  for (__typeof((ma).begin()) it = (ma).begin(); it != (ma).end(); it++) {
    pair<int, int> z = it->first;
    point p;
    p.init(z.first, z.second);
    a.push_back(p);
  }
  convexHull();
  leftMost = downMost = ch[0];
  for (int i = (1); i <= (int((ch).size()) - 1); i++)
    if (ch[i].x < leftMost.x)
      leftMost = ch[i];
    else if (leftMost.x == ch[i].x && leftMost.y > ch[i].y)
      leftMost = ch[i];
  for (int i = (1); i <= (int((ch).size()) - 1); i++)
    if (ch[i].y < downMost.y)
      downMost = ch[i];
    else if (downMost.y == ch[i].y && downMost.x > ch[i].x)
      downMost = ch[i];
  if (int((ch).size()) == 3) {
    if (crossProduct(ch[0], ch[1], ch[2]) > 1e-22)
      reverse((ch).begin(), (ch).end());
  }
  for (int i = (0); i <= (int((ch).size()) - 1); i++)
    if (ch[i] == leftMost) {
      int u = i;
      while (1) {
        vector<int> z = ma[pair<int, int>(ch[u].xx, ch[u].yy)];
        for (int j = (0); j <= (int((z).size()) - 1); j++) res.push_back(z[j]);
        if (ch[u] == downMost) break;
        u = (u - 1 + int((ch).size())) % int((ch).size());
      }
      break;
    }
  sort((res).begin(), (res).end());
  for (int i = (0); i <= (int((res).size()) - 1); i++) cout << res[i] << " ";
  return 0;
}
