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 dx4[] = {-1, 0, 1, 0};
int dy4[] = {0, 1, 0, -1};
int dx8[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy8[] = {0, 1, 1, 1, 0, -1, -1, -1};
void Duxar(int _this_line) {}
bool AreEqual(double a, double b) { return (fabs(a - b) < 1e-10); }
template <class T>
bool GetNr(T &_value) {
  T _sign = 1;
  char ch;
  _value = 0;
  while (!isdigit(ch = getchar())) {
    if (ch == -1) {
      return false;
    }
    ch == '-' ? _sign = -1 : _sign = 1;
  }
  do {
    _value = _value * 10 + (ch - '0');
  } while (isdigit(ch = getchar()));
  _value *= _sign;
  return true;
}
template <class T>
void WriteNo(T _value, char _ch = ' ') {
  cout << _value << _ch;
}
bool operator==(const pair<int, int> &a, const pair<int, int> &b) {
  return a.first == b.first && a.second == b.second;
}
int N;
vector<pair<int, int>> points, hull;
map<pair<int, int>, vector<int>> tablepos;
pair<int, int> st, en;
template <class T>
long long CrossProduct(pair<T, T> a, pair<T, T> b,
                       pair<T, T> o = make_pair(0, 0)) {
  return (long long)a.second * b.first * o.second * o.first -
         (long long)a.second * b.first * b.second * o.first -
         (long long)a.first * a.second * o.second * b.first -
         (long long)a.first * b.second * o.first * o.second +
         (long long)a.first * b.first * b.second * o.second +
         (long long)a.first * a.second * b.second * o.first;
}
long long GetDistance(pair<int, int> a, pair<int, int> b) {
  long long t1, t2;
  t1 = a.first - b.first;
  t2 = a.second - b.second;
  return t1 * t1 + t2 * t2;
}
bool ByCrossProduct(pair<int, int> a, pair<int, int> b) {
  long long res = CrossProduct(a, b, st);
  if (res == 0LL) {
    return GetDistance(st, a) < GetDistance(st, b);
  }
  return res > 0;
}
int main() {
  string fileInput = "sum";
  int i, pos1 = 0, pos2 = 0, lastp, x, y;
  vector<int> ans;
  GetNr(N);
  if (N == 1) {
    WriteNo(1, '\n');
    return 0;
  }
  for (i = 0; i < N; ++i) {
    GetNr(x);
    GetNr(y);
    if (tablepos.find(make_pair(x, y)) == tablepos.end()) {
      points.push_back(make_pair(x, y));
    }
    tablepos[make_pair(x, y)].push_back(i + 1);
  }
  if (tablepos.size() == 1) {
    for (i = 1; i <= N; ++i) {
      WriteNo(i);
    }
    putchar('\n');
    return 0;
  }
  for (i = 1; i < points.size(); ++i) {
    if (points[i] > points[pos1]) {
      pos1 = i;
    }
    if (make_pair(points[i].second, points[i].first) >
        make_pair(points[pos2].second, points[pos2].first)) {
      pos2 = i;
    }
  }
  st = points[pos1];
  en = points[pos2];
  if (pos1 == pos2) {
    for (auto pt : tablepos[st]) {
      WriteNo(pt);
    }
    return 0;
  }
  sort(points.begin(), points.end(), ByCrossProduct);
  hull.resize(points.size());
  hull[0] = points[0];
  lastp = 0;
  for (i = 1; i < points.size(); ++i) {
    while (lastp >= 1 &&
           CrossProduct(hull[lastp], points[i], hull[lastp - 1]) < 0) {
      lastp--;
    }
    ++lastp;
    hull[lastp] = points[i];
    if (points[i] == en) {
      break;
    }
  }
  for (i = 0; i <= lastp; ++i) {
    for (auto pt : tablepos[hull[i]]) {
      ans.push_back(pt);
    }
  }
  sort((ans).begin(), (ans).end());
  for (auto pt : ans) {
    WriteNo(pt);
  }
  putchar('\n');
  return 0;
}
