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 long long MAXN = 2e5 + 10;
const long double INF = 1e15 + 10;
const long double Epsilon = 1e-7;
struct line {
  long double v, val_1, val_2;
  long long s, dp, id;
};
line k[MAXN];
vector<long long> res;
long long s[MAXN];
long long r[MAXN];
bool cmp1(line a, line b) {
  if (a.s == b.s) {
    return (a.v > b.v);
  } else {
    return (a.s < b.s);
  }
}
bool cmp2(line a, line b) {
  if (a.s == b.s) {
    return (a.v < b.v);
  } else {
    return (a.s < b.s);
  }
}
long double T(long long i, long long j, bool z) {
  if (k[i].v < k[j].v) {
    return INF;
  }
  if (abs(k[i].v - k[j].v) < Epsilon && abs(k[i].s - k[j].s) < Epsilon) {
    if (z) {
      return INF;
    } else {
      return 0;
    }
  }
  return (k[j].s - k[i].s) / (long double)(k[i].v - k[j].v);
}
int main() {
  ios_base ::sync_with_stdio(false);
  cin.tie(0);
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    cin >> s[i] >> r[i];
    k[i].id = i;
    k[i].s = r[i];
    k[i].v = -(r[i]) / (long double)(s[i]);
  }
  sort(k, k + n, cmp1);
  k[0].dp = 0;
  k[0].val_1 = INF;
  for (long long i = 1; i < n; i++) {
    k[i].dp = i - 1;
    bool h = false;
    while (T(k[i].dp, i, 1) - T(k[k[i].dp].dp, k[i].dp, 1) > Epsilon) {
      h = true;
      if (k[i].dp == k[k[i].dp].dp) {
        break;
      }
      k[i].dp = k[k[i].dp].dp;
    }
    if ((!h && abs(T(i - 1, i, 1) - INF) < Epsilon) ||
        (abs(T(k[i].dp, i, 1) - INF) < Epsilon)) {
      k[i].dp = i;
      k[i].val_1 = INF;
    } else {
      k[i].val_1 = T(k[i].dp, i, 1);
    }
  }
  for (long long i = 0; i < n; i++) {
    k[i].s = -k[i].s;
    k[i].v = -k[i].v;
  }
  sort(k, k + n, cmp2);
  k[0].dp = 0;
  k[0].val_2 = 0;
  for (long long i = 1; i < n; i++) {
    k[i].dp = i - 1;
    while (T(k[k[i].dp].dp, k[i].dp, 0) - T(k[i].dp, i, 0) > Epsilon) {
      if (k[i].dp == k[k[i].dp].dp) {
        break;
      }
      k[i].dp = k[k[i].dp].dp;
    }
    k[i].val_2 = T(k[i].dp, i, 0);
  }
  for (long long i = 0; i < n; i++) {
    k[i].s = -k[i].s;
    k[i].v = -k[i].v;
  }
  for (long long i = 0; i < n; i++) {
    if (abs(k[i].val_2 - INF) < Epsilon) {
      continue;
    }
    if (k[i].val_1 - k[i].val_2 > 0 &&
        ((k[i].val_1 * k[i].v) + k[i].s > Epsilon ||
         (k[i].val_2 * k[i].v) + k[i].s > Epsilon)) {
      res.push_back(k[i].id + 1);
    }
  }
  sort(res.begin(), res.end());
  for (long long i = 0; i < res.size(); i++) {
    cout << res[i] << " ";
  }
}
