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;
template <class T>
inline T bigmod(T p, T e, T M) {
  T ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return (T)ret;
}
template <class T>
inline T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <class T>
inline T modinverse(T a, T M) {
  return bigmod(a, M - 2, M);
}
template <class T, class X>
inline bool getbit(T a, X i) {
  T t = 1;
  return ((a & (t << i)) > 0);
}
template <class T, class X>
inline T setbit(T a, X i) {
  T t = 1;
  return (a | (t << i));
}
template <class T, class X>
inline T resetbit(T a, X i) {
  T t = 1;
  return (a & (~(t << i)));
}
int n;
pair<long long, long long> arr[200009];
vector<pair<long long, long long> > cost;
int pointer;
vector<long long> M, B, ind;
void init() {
  pointer = 0;
  M.clear();
  B.clear();
}
bool bad(int l1, int l2, int l3) {
  return M[l3] * B[l2] * (-B[l3] + B[l1]) * (-M[l1] + M[l2]) >
         B[l3] * M[l2] * (-B[l2] + B[l1]) * (-M[l1] + M[l3]);
}
void add(long long m, long long b, int in) {
  M.push_back(m);
  B.push_back(b);
  ind.push_back(in);
  while (M.size() >= 3 && bad(M.size() - 3, M.size() - 2, M.size() - 1)) {
    M.erase(M.end() - 2);
    B.erase(B.end() - 2);
    ind.erase(ind.end() - 2);
  }
}
map<int, vector<int> > mp[10009];
vector<int> fnl;
int main() {
  scanf("%d", &n);
  int mxf = 0, mxs = 0;
  for (int i = (1); i <= (n); i++) {
    scanf("%lld %lld", &arr[i].first, &arr[i].second);
    mp[arr[i].first][arr[i].second].push_back(i);
    mxf = max(mxf, (int)arr[i].first);
    mxs = max(mxs, (int)arr[i].second);
  }
  sort(arr + 1, arr + n + 1);
  for (int i = (1); i <= (n); i++) {
    while (cost.size() > 0 && cost[cost.size() - 1].second <= arr[i].second)
      cost.pop_back();
    cost.push_back(arr[i]);
  }
  init();
  for (int i = (0); i <= (cost.size() - 1); i++) {
    add(cost[i].second, cost[i].first, i);
  }
  for (int i = (0); i <= (ind.size() - 1); i++) {
    for (int j = (0);
         j <= (mp[cost[ind[i]].first][cost[ind[i]].second].size() - 1); j++)
      fnl.push_back(mp[cost[ind[i]].first][cost[ind[i]].second][j]);
  }
  sort(fnl.begin(), fnl.end());
  fnl.erase(unique(fnl.begin(), fnl.end()), fnl.end());
  bool flag = 0;
  for (int i = (0); i <= (fnl.size() - 1); i++) {
    if (flag) printf(" ");
    flag = 1;
    printf("%d", fnl[i]);
  }
  printf("\n");
  return 0;
}
