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, s[200010], r[200010];
struct pt {
  double x, y;
  int ind;
} t[200010];
bool operator<(const pt& a, const pt& b) {
  if (s[a.ind] == s[b.ind]) return r[a.ind] > r[b.ind];
  return s[a.ind] > s[b.ind];
}
double operator^(const pt& a, const pt& b) { return a.x * b.y - a.y * b.x; }
bool ontheleft(const pt& a, const pt& b, const pt& c) {
  long long all1 = (long long)s[a.ind] * r[a.ind];
  long long all2 = (long long)s[b.ind] * r[b.ind] * s[c.ind] * r[c.ind];
  long long res = (all2 / ((long long)r[b.ind] * s[c.ind])) * (all1) -
                  (all2 / (long long)r[b.ind]) * (all1 / s[a.ind]) -
                  (all2 / (long long)s[c.ind]) * (all1 / r[a.ind]) -
                  (all2 / ((long long)s[b.ind] * r[c.ind])) * (all1) +
                  (all2 / (long long)s[b.ind]) * (all1 / r[a.ind]) +
                  (all2 / (long long)r[c.ind]) * (all1 / s[a.ind]);
  res = -res;
  return res > 0;
}
int stk[200010], top;
vector<int> addition[200010];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d%d", &s[i], &r[i]);
  for (int i = 1; i <= n; i++) {
    t[i].x = 1.0 / s[i];
    t[i].y = 1.0 / r[i];
    t[i].ind = i;
  }
  sort(t + 1, t + n + 1);
  stk[top = 1] = 1;
  for (int i = 2; i <= n; i++) {
    if (s[t[i].ind] == s[t[stk[top]].ind] &&
        r[t[i].ind] == r[t[stk[top]].ind]) {
      addition[t[stk[top]].ind].push_back(t[i].ind);
      continue;
    }
    if (r[t[i].ind] <= r[t[stk[top]].ind]) continue;
    while (top > 1 && ontheleft(t[stk[top - 1]], t[i], t[stk[top]])) top--;
    stk[++top] = i;
  }
  deque<int> ans;
  for (int i = 1; i <= top; i++) ans.push_back(t[stk[i]].ind);
  if (ans.size() >= 2) {
    int p1 = ans[0], p2 = ans[1];
    if (s[p1] == s[p2] || r[p1] == r[p2]) ans.pop_front();
  }
  if (ans.size() >= 2) {
    int p1 = ans[int(ans.size()) - 2], p2 = ans[int(ans.size()) - 1];
    if (s[p1] == s[p2] || r[p1] == r[p2]) ans.pop_back();
  }
  while (ans.size() >= 2) {
    int p1 = ans[int(ans.size()) - 2], p2 = ans[int(ans.size()) - 1];
    if (r[p2] <= r[p1])
      ans.pop_back();
    else
      break;
  }
  int nowlen = ans.size();
  for (int i = 0; i < nowlen; i++) {
    for (auto x : addition[ans[i]]) ans.push_back(x);
  }
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++)
    printf("%d%c", ans[i], " \n"[i + 1 == ans.size()]);
  return 0;
}
