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;
pair<int, int> s[300100];
pair<int, int> r[300100];
int res[300300];
int s1[300300];
int r1[300300];
map<pair<int, int>, int> rep;
int dp[94040];
void add(int a, int b, int x, int l = 1, int h = 1e4 + 2, int p = 1) {
  if (a == l && b == h) {
    dp[p] += x;
    return;
  }
  int m = (l + h) / 2;
  if (b <= m) {
    add(a, b, x, l, m, 2 * p);
  } else if (a > m) {
    add(a, b, x, m + 1, h, 2 * p + 1);
  } else {
    add(m + 1, b, x, m + 1, h, 2 * p + 1);
    add(a, m, x, l, m, 2 * p);
  }
  dp[p] = dp[2 * p] + dp[2 * p + 1];
}
int cal(int a, int b, int x = 0, int l = 1, int h = 1e4 + 2, int p = 1) {
  if (a == l && b == h) {
    return dp[p];
  }
  int m = (l + h) / 2;
  if (b <= m) {
    return cal(a, b, x, l, m, 2 * p);
  } else if (a > m) {
    return cal(a, b, x, m + 1, h, 2 * p + 1);
  } else {
    return cal(m + 1, b, x, m + 1, h, 2 * p + 1) + cal(a, m, x, l, m, 2 * p);
  }
}
map<pair<int, int>, int> ch;
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &s[i].first);
    scanf("%d", &r[i].first);
    r[i].second = i;
    s[i].second = i;
    rep[make_pair(s[i].first, r[i].first)]++;
    s1[i] = s[i].first;
    r1[i] = r[i].first;
  }
  sort(s + 1, s + n + 1);
  for (int i = 1; i <= n;) {
    int j;
    for (j = i; j <= n; j++) {
      if (s[i].first != s[j].first) break;
      int in = s[j].second;
      res[in] += i - 1;
      if (r[in].first - 1 >= 1) res[in] -= cal(1, r[in].first - 1);
    }
    for (int k = i; k < j; k++) {
      int in = s[k].second;
      add(r[in].first, r[in].first, 1);
    }
    i = j;
  }
  sort(r + 1, r + n + 1);
  for (int i = 1; i <= n;) {
    int j;
    for (j = i; j <= n; j++) {
      if (r[i].first != r[j].first) break;
      int in = r[j].second;
      res[in] += i - 1;
    }
    i = j;
  }
  vector<pair<long long, long long> > v;
  for (int i = 1; i <= n; i++) {
    if (res[i] == n - rep[make_pair(s1[i], r1[i])] &&
        !ch.count(make_pair(s1[i], r1[i]))) {
      ch[make_pair(s1[i], r1[i])] = 1;
      v.push_back(make_pair(s1[i], r1[i]));
    }
  }
  sort(v.begin(), v.end());
  reverse(v.begin(), v.end());
  ch[v[0]]++;
  if (v.size() > 1) ch[v.back()]++;
  int m;
  double t;
  for (int i = 1; i < v.size() - 1; i++) {
    double bef = -1e18;
    int l = i + 1, r = v.size() - 1;
    while (l <= r) {
      m = (l + r) / 2;
      t = 1.0 * (1.0 * v[m].second - v[i].second) /
          (v[m].second * v[i].second) / (1.0 * v[i].first - v[m].first) *
          (1.0 * v[i].first * v[m].first);
      if (l == r) {
        bef = max(bef, t);
        break;
      }
      m++;
      double t1 = 1.0 * (1.0 * v[m].second - v[i].second) /
                  (v[m].second * v[i].second) /
                  (1.0 * v[i].first - v[m].first) *
                  (1.0 * v[i].first * v[m].first);
      if (t >= t1) {
        r = m - 2;
        bef = max(bef, t);
      } else {
        l = m + 1;
        bef = max(bef, t1);
      }
    }
    m = i + 1;
    t = 1.0 * (1.0 * v[m].second - v[i].second) / (v[m].second * v[i].second) /
        (1.0 * v[i].first - v[m].first) * (1.0 * v[i].first * v[m].first);
    bef = max(bef, t);
    m = v.size() - 1;
    t = 1.0 * (1.0 * v[m].second - v[i].second) / (v[m].second * v[i].second) /
        (1.0 * v[i].first - v[m].first) * (1.0 * v[i].first * v[m].first);
    bef = max(bef, t);
    double aft = 1e18;
    l = 0, r = i - 1;
    while (l <= r) {
      int m = (l + r) / 2;
      t = 1.0 * (1.0 * v[m].second - v[i].second) /
          (v[m].second * v[i].second) / (1.0 * v[i].first - v[m].first) *
          (1.0 * v[i].first * v[m].first);
      if (l == r) {
        aft = min(aft, t);
        break;
      }
      m++;
      double t1 = 1.0 * (1.0 * v[m].second - v[i].second) /
                  (v[m].second * v[i].second) /
                  (1.0 * v[i].first - v[m].first) *
                  (1.0 * v[i].first * v[m].first);
      if (t <= t1) {
        r = m - 2;
        aft = min(aft, t);
      } else {
        l = m + 1;
        aft = min(aft, t1);
      }
    }
    m = 0;
    t = 1.0 * (1.0 * v[m].second - v[i].second) / (v[m].second * v[i].second) /
        (1.0 * v[i].first - v[m].first) * (1.0 * v[i].first * v[m].first);
    aft = min(aft, t);
    m = i - 1;
    t = 1.0 * (1.0 * v[m].second - v[i].second) / (v[m].second * v[i].second) /
        (1.0 * v[i].first - v[m].first) * (1.0 * v[i].first * v[m].first);
    aft = min(aft, t);
    if (aft >= bef) {
      ch[v[i]]++;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (ch[make_pair(s1[i], r1[i])] == 2) printf("%d ", i);
  }
  cout << endl;
  return 0;
}
