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;
struct Member {
  int s;
  int r;
  int id;
};
Member arr[2 * 100000];
int main(int argc, char** argv) {
  cout.sync_with_stdio(false);
  cin.sync_with_stdio(false);
  istream* pinp;
  { pinp = &cin; }
  istream& icp = *pinp;
  int i, j = 0;
  int num;
  icp >> num;
  i = num;
  while (i--) {
    icp >> arr[j].s;
    icp >> arr[j].r;
    arr[j].id = j + 1;
    j++;
  }
  std::sort(begin(arr), begin(arr) + num,
            [](Member& a, Member& b) { return a.r > b.r; });
  int start = 0;
  int maxS = -1;
  int maxSIdx;
  int localMax = -1;
  int localIdx;
  list<int> nums;
  for (int k = 0; k < num; k++) {
    if (arr[k].s > localMax) {
      localMax = arr[k].s;
      localIdx = k;
    }
    if (k == num - 1 || arr[k + 1].r != arr[k].r) {
      if (localMax > maxS) {
        while (nums.size() >= 2) {
          auto it = nums.rbegin();
          Member* m2 = &arr[*it];
          Member* m1 = &arr[*(++it)];
          while (m1->r == m2->r) {
            auto next = ++it;
            if (next == nums.rend()) break;
            m1 = &arr[*next];
          }
          if (m1->r == m2->r) break;
          Member* m3 = &arr[localIdx];
          double rs32 =
              (double(m3->r) * m2->r * (double(m3->s) - double(m2->s))) /
              (double(m3->s) * m2->s * (double(m2->r) - double(m3->r)));
          double rs21 =
              (double(m1->r) * m2->r * (double(m2->s) - double(m1->s))) /
              (double(m1->s) * m2->s * (double(m1->r) - double(m2->r)));
          if (rs21 < rs32) {
            while (arr[nums.back()].r == m2->r) nums.pop_back();
          } else {
            break;
          }
        }
        for (int s = start; s <= k; s++) {
          if (arr[s].s == localMax) {
            nums.push_back(s);
          }
        }
        maxS = localMax;
        maxSIdx = localIdx;
      }
      localMax = -1;
      start = k + 1;
    }
  }
  vector<pair<int, int>> res;
  for (auto it : nums) {
    res.push_back({it, arr[it].id});
  }
  std::sort(begin(res), end(res), [](pair<int, int>& a, pair<int, int>& b) {
    return a.second < b.second;
  });
  bool test = false;
  for (auto m : res) {
    if (!test)
      cout << m.second << " ";
    else
      cout << arr[m.first].id << " " << arr[m.first].r << " " << arr[m.first].s
           << " ";
  }
  return 0;
}
