#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
int n, p, q;
map<int, int> nerds;
map<int, int> nerdTmp;
map<int, int> nerds1;
vector<pair<int, int> > input;
bool addNerd(int p, int q) {
  map<int, int>::iterator iter = nerds.lower_bound(p);
  if (iter == nerds.end()) {
    nerds[p] = q;
    return true;
  } else {
    if (q > iter->second) {
      nerds[p] = q;
      return true;
    }
  }
  return false;
}
void cutNotNerds(int p, int q) {
  map<int, int>::iterator iter = nerds.upper_bound(p);
  map<int, int>::iterator iter1;
  if (iter == nerds.begin()) return;
  iter--;
  while (1) {
    if (iter == nerds.begin()) {
      if (iter->first < p && q >= iter->second) nerds.erase(iter);
      break;
    } else {
      if (p == iter->first) {
        iter--;
        continue;
      }
      if (q < iter->second) break;
      iter1 = --iter;
      nerds.erase(++iter);
      iter = iter1;
    }
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < (int)n; i++) {
    cin >> p >> q;
    input.push_back(make_pair(p, q));
    if (addNerd(p, q)) {
      cutNotNerds(p, q);
    }
  }
  vector<pair<double, int> > idxs;
  for (int i = 0; i < (int)n; i++) {
    if (nerds[input[i].first] == input[i].second) {
      if (nerdTmp[input[i].first]) continue;
      idxs.push_back(make_pair(1 / (double)input[i].first, i));
      nerdTmp[input[i].first] = 1;
    }
  }
  sort(idxs.begin(), idxs.end());
  if (idxs.size() == 1) {
    nerds1[input[idxs[0].second].first] = input[idxs[0].second].second;
  } else {
    deque<pair<double, pair<int, int> > > q;
    for (int i = 0; i < (int)idxs.size() - 1; i++) {
      int currIdx = idxs[i].second;
      double currX = 1 / (double)input[currIdx].first;
      double currY = 1 / (double)input[currIdx].second;
      int nextIdx = idxs[i + 1].second;
      double nextX = 1 / (double)input[nextIdx].first;
      double nextY = 1 / (double)input[nextIdx].second;
      if (i == 0) {
        double nextSlop = (currY - nextY) / (double)(nextX - currX);
        if (nextSlop < 0) cout << "wrong: " << nextSlop;
        q.push_back(make_pair(nextSlop, make_pair(currIdx, nextIdx)));
      } else {
        while (!q.empty()) {
          pair<double, pair<int, int> > t = q.back();
          double nextSlop = (currY - nextY) / (double)(nextX - currX);
          if (nextSlop < 0) cout << "wrong1: " << nextSlop;
          if (nextSlop <= t.first) {
            q.push_back(make_pair(nextSlop, make_pair(currIdx, nextIdx)));
            break;
          } else {
            q.pop_back();
            currIdx = t.second.first;
            currX = 1 / (double)input[currIdx].first;
            currY = 1 / (double)input[currIdx].second;
            if (q.empty()) {
              nextSlop = (currY - nextY) / (double)(nextX - currX);
              q.push_back(
                  make_pair(nextSlop, make_pair(currIdx, idxs[i + 1].second)));
              break;
            }
          }
        }
      }
    }
    while (!q.empty()) {
      pair<double, pair<int, int> > t = q.front();
      q.pop_front();
      nerds1[input[t.second.first].first] = input[t.second.first].second;
      nerds1[input[t.second.second].first] = input[t.second.second].second;
    }
  }
  for (int i = 0; i < (int)n; i++) {
    if (nerds1[input[i].first] == input[i].second) cout << i + 1 << " ";
  }
  cout << endl;
}
