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;
vector<pair<int, int> > all, temp;
int R[10004], S[10004], is_ans[10004];
int maximum[200005];
map<pair<int, int>, vector<int> > data;
vector<int> answer;
pair<long long, long long> now, preve;
void put_ans(pair<int, int> &x) {
  vector<int>::iterator it, en;
  it = data[x].begin();
  en = data[x].end();
  while (it != en) {
    answer.push_back(*it);
    it++;
  }
  return;
}
void print_ans(void) {
  sort(answer.begin(), answer.end());
  int i;
  for (i = 0; i < answer.size(); i++) printf("%d ", answer[i] + 1);
  printf("\n");
  return;
}
void cross(pair<int, int> one, pair<int, int> two) {
  long long r1 = one.first, s1 = one.second, r2 = two.first, s2 = two.second;
  now.first = s1 * s2 * (r2 - r1);
  now.second = r1 * r2 * (s1 - s2);
  if (now.first < 0) now.first *= -1;
  if (now.second < 0) now.second *= -1;
}
bool is_it(void) {
  double a = now.first, b = now.second, c = preve.first, d = preve.second;
  return a * d <= b * c;
}
int main() {
  int i, n;
  scanf("%d", &n);
  memset(R, -1, sizeof(R));
  memset(S, -1, sizeof(S));
  for (i = 0; i < n; i++) {
    int r, second;
    scanf("%d", &r);
    scanf("%d", &second);
    data[make_pair(r, second)].push_back(i);
    if (data[make_pair(r, second)].size() > 1) continue;
    R[r] = max(R[r], second);
    S[second] = max(S[second], r);
  }
  for (i = 0; i < 10004; i++) {
    if (R[i] == -1 || i != S[R[i]]) continue;
    all.push_back(make_pair(i, R[i]));
  }
  sort(all.begin(), all.end());
  maximum[all.size()] = -1;
  for (i = all.size() - 1; i >= 0; i--)
    maximum[i] = max(all[i].second, maximum[i + 1]);
  for (i = 0; i < all.size(); i++)
    if (all[i].second > maximum[i + 1]) temp.push_back(all[i]);
  all.swap(temp);
  if (all.size() < 3) {
    for (i = 0; i < all.size(); i++) put_ans(all[i]);
    print_ans();
    return 0;
  }
  for (i = 0; i < all.size() / 2; i++) swap(all[i], all[all.size() - i - 1]);
  for (i = 0; i < all.size(); i++) is_ans[i] = 1;
  for (i = 0; i < all.size() - 1; i++) {
    cross(all[i], all[all.size() - 1]);
    preve = now;
    for (int j = all.size() - 2; j > i; j--) {
      cross(all[i], all[j]);
      if (is_it()) {
        preve = now;
      } else
        is_ans[j] *= 0;
    }
  }
  for (i = 0; i < all.size(); i++)
    if (is_ans[i]) put_ans(all[i]);
  print_ans();
  return 0;
}
