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 double EPS = 1e-20;
template <class C>
C veccross(pair<C, C> p1, pair<C, C> p2, pair<C, C> p3) {
  p3.first -= p1.first;
  p2.first -= p1.first;
  p3.second -= p1.second;
  p2.second -= p1.second;
  return p3.first * p2.second - p2.first * p3.second;
}
template <class C>
vector<int> convex_hull(vector<pair<C, C> >& vp) {
  vector<pair<pair<C, C>, int> > sorted;
  vector<int> res;
  int i, k = 0, rb;
  if (vp.size() <= 2) {
    if (vp.size() >= 1) res.push_back(0);
    if (vp.size() >= 2 && vp[0] != vp[1]) res.push_back(1);
    return res;
  }
  for (i = 0; i < vp.size(); i++) sorted.push_back(make_pair(vp[i], i));
  sort(sorted.begin(), sorted.end());
  reverse(sorted.begin(), sorted.end());
  res.resize(vp.size() * 2);
  for (i = 0; i < vp.size(); i++) {
    while (k > 1 &&
           veccross(vp[res[k - 2]], vp[res[k - 1]], sorted[i].first) <= -EPS)
      k--;
    res[k++] = sorted[i].second;
  }
  res.resize(k);
  return res;
}
int N;
int S[303030], T[303030];
int ma[11000];
multiset<int> SS[10100];
vector<int> R;
void solve() {
  int i, j, k, l, r, x, y, s;
  cin >> N;
  for (i = 0; i < N; i++) {
    cin >> S[i] >> T[i];
    if (ma[S[i]] < T[i]) ma[S[i]] = T[i], SS[S[i]].clear();
    if (ma[S[i]] == T[i]) SS[S[i]].insert(i + 1);
  }
  vector<pair<double, double> > V;
  y = -1;
  for (s = 10000; s >= 1; s--)
    if (ma[s] > 0 && (y == -1 || ma[s] > ma[y]))
      V.push_back(make_pair(1.0 / s, 1.0 / ma[s])), y = s;
  vector<int> RR = convex_hull(V);
  for (auto& r : RR)
    for (auto& r2 : SS[(int)floor(1.0 / V[r].first + 0.1)]) R.push_back(r2);
  sort(R.begin(), R.end());
  for (auto& r : R) (void)printf("%d ", r);
  (void)printf("\n");
}
int main(int argc, char** argv) {
  string s;
  int i;
  if (argc == 1) ios::sync_with_stdio(false);
  for (i = 0; i < argc - 1; i++) s += argv[i + 1], s += '\n';
  for (i = 0; i < s.size(); i++) ungetc(s[s.size() - 1 - i], stdin);
  solve();
  return 0;
}
