#include <bits/stdc++.h>

#define endl '\n'
#define eps -1e-20

using namespace std;

struct Point {
	long double x, y;
	long long xx, yy;
	Point() {}
	bool operator < (const Point &p) const {
		return x < p.x || (x == p.x && y - p.y < eps);
	}
};

inline long double cross(Point O, Point A, Point B) {
	return (A.x - O.x) * (B.y - O.y) - (A.y - O.y) * (B.x - O.x);
}

int sz;

vector <Point> convex_hull(vector<Point> &P) {
	int k = 0, n = P.size();
	vector<Point> H(2*n);
	sort(P.begin(), P.end());
	for (int i = 0; i < n; i++) {
		while (k >= 2 && cross(H[k-2], H[k-1], P[i]) < eps) k--;
		H[k++] = P[i];
	}
	for (int i = n-2, t = k+1; i >= 0; i--) {
		while (k >= t && cross(H[k-2], H[k-1], P[i]) < eps) k--;
		H[k++] = P[i];
	}
	sz = k-1;
	return H;
}

vector <Point> point;

map < pair <int, int>, vector <int> > mp;

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	long long xxx = 0, yyy = 0, xx, yy;
	Point _point;
	for(int i=0; i<n; i++) {
		cin >> xx >> yy;
		if(yy > yyy) {
			xxx = xx;
			yyy = yy;
		}
		else if(yy == yyy && xx > xxx) xxx = xx;
		_point.x = 1. / xx;
		_point.y = 1. / yy;
		_point.xx = xx;
		_point.yy = yy;
		if(mp.count(make_pair(xx, yy)) == 0) point.push_back(_point);
		mp[make_pair(xx, yy)].push_back(i);
	}
	vector <Point> P;
	if(point.size() >= 2) P = convex_hull(point);
	else {
		sz = point.size();
		P = point;
	}
	vector <int> v;
	for(int i=0; i<sz; i++) {
		for(int j : mp[make_pair(P[i].xx, P[i].yy)]) v.push_back(j);
		if(P[i].xx == xxx && P[i].yy == yyy) break;
	}
	sort(v.begin(), v.end());
	for(int i : v) cout << i+1 << " ";
	return 0;
}


#include <bits/stdc++.h>

#define endl '\n'
#define eps -1e-37

using namespace std;

struct Point {
	long double x, y;
	long long xx, yy;
	Point() {}
	bool operator < (const Point &p) const {
		return x < p.x || (x == p.x && y - p.y < eps);
	}
};

inline long double cross(Point O, Point A, Point B) {
	return (A.x - O.x) * (B.y - O.y) - (A.y - O.y) * (B.x - O.x);
}

int sz;

vector <Point> convex_hull(vector<Point> &P) {
	int k = 0, n = P.size();
	vector<Point> H(2*n);
	sort(P.begin(), P.end());
	for (int i = 0; i < n; i++) {
		while (k >= 2 && cross(H[k-2], H[k-1], P[i]) < eps) k--;
		H[k++] = P[i];
	}
	for (int i = n-2, t = k+1; i >= 0; i--) {
		while (k >= t && cross(H[k-2], H[k-1], P[i]) < eps) k--;
		H[k++] = P[i];
	}
	H.resize(k-1);
	return H;
}

vector <Point> point;

map < pair <int, int>, vector <int> > mp;

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	if(n == 2) {
		// cin >> p >> q >> pp >> qq;
		// cout << 1 << " " << 2 << endl;
		// return 0;
	}
	long long xxx = 0, yyy = 0, xx, yy;
	Point _point;
	for(int i=0; i<n; i++) {
		cin >> xx >> yy;
		if(yy > yyy) {
			xxx = xx;
			yyy = yy;
		}
		else if(yy == yyy && xx > xxx) xxx = xx;
		_point.x = 1. / xx;
		_point.y = 1. / yy;
		_point.xx = xx;
		_point.yy = yy;
		if(mp.count(make_pair(xx, yy)) == 0) point.push_back(_point);
		mp[make_pair(xx, yy)].push_back(i);
	}
	vector <Point> P;
	if(point.size() >= 2) P = convex_hull(point);
	else P = point;
	// cout << P.size() << endl;
	vector <int> v;
	for(int i=0; i<P.size(); i++) {
		// cout << i << " : " <<  P[i].xx << " " << P[i].yy << endl;
		for(int j : mp[make_pair(P[i].xx, P[i].yy)]) v.push_back(j);
		if(P[i].xx == xxx && P[i].yy == yyy) break;
	}
	sort(v.begin(), v.end());
	for(int i : v) cout << i+1 << " ";
	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = arr[k].id;
		}
		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax)
						nums.push_back(localId);
				}
				maxS = localMax;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 localMax = -1;
	int localId;
	vector<int> nums;
	int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = arr[k].id;
		}
		if (k == num-1 || arr[k+1].r != cR) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax)
						nums.push_back(localId);
				}
				maxS = localMax;
			}
			localMax = -1;
			start = k + 1;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 localMax = -1;
	int localId;
	vector<int> nums;
	int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = arr[k].id;
		}
		if (k == num-1 || arr[k+1].r != cR) {
			if (localMax > maxS) {
				//for (int s = start; s <= k; s++) {
				//	if (arr[s].s == localMax)
						nums.push_back(localId);
				//}
				maxS = localMax;
			}
			localMax = -1;
			//start = k + 1;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>

using namespace std;

struct Member {
	int s;
	int r;
	int id;
};

Member arr[2 * 100000];

#if 1
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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;
	//int cR = arr[0].r;
	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/*cR*/) {
			if (localMax > maxS) {

				while (nums.size() >= 2) {
					auto it = nums.rbegin();
					Member* m2 = &arr[*it];
					Member* m1 = &arr[*(++it)];
					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) {
						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;
			//cR = arr[k + 1].r;
		}
	}
	vector<pair<int,int>> res;
	//std::copy(begin(nums), end(nums), std::back_inserter(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; });
	for (auto m : res) {
		//cout << m.second << " ";
		cout << arr[m.first].id << " " << arr[m.first].r << " " << arr[m.first].s << " ";
	}

	return 0;
}
#else
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 maxSId;
	int localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = k;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							//9787 9996 9788 1199 180599 9786 5569 9995 9927 9995
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << " " << maxS << " " << arr[maxSId].r << " " << arr[maxSId].s << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
				maxSId = localId;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}
#endif


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>

using namespace std;

struct Member {
	int s;
	int r;
	int id;
};

Member arr[2 * 100000];

#if 1
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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;
	//int cR = arr[0].r;
	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/*cR*/) {
			if (localMax > maxS) {

				while (nums.size() >= 2) {
					auto it = rbegin(nums);
					Member* m2 = &arr[*it];
					Member* m1 = &arr[*(++it)];
					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) {
						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;
			//cR = arr[k + 1].r;
		}
	}
	vector<int> res;
	//std::copy(begin(nums), end(nums), std::back_inserter(res));
	for (auto it : nums) {
		res.push_back(arr[it].id);
	}
	std::sort(begin(res), end(res));
	for (auto m : res) {
		cout << m << " ";
	}

	return 0;
}
#else
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 maxSId;
	int localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = k;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							//9787 9996 9788 1199 180599 9786 5569 9995 9927 9995
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << " " << maxS << " " << arr[maxSId].r << " " << arr[maxSId].s << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
				maxSId = localId;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}
#endif


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>
#include <cinttypes>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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];

					int64_t rs32 = int64_t(m3->r) * (m3->s - m2->s) * m1->s*m1->r - m2->r;
					int64_t rs21 = int64_t(m1->r) * (m2->s - m1->s) * m3->s*m2->r - m3->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; });
	for (auto m : res) {
		cout << m.second << " ";
	}

	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 localMax = -1;
	//int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			//localId = arr[k].id;
		}
		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (arr[k].id == 58320)
				cout << arr[k].r << " " << arr[k].s << " " << arr[start - 1].r << " " << arr[start - 1].s << maxS << " ";
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax)
						nums.push_back(arr[s].id);
				}
				maxS = localMax;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>

using namespace std;

struct Member {
	int s;
	int r;
	int id;
};

Member arr[2 * 100000];

#if 1
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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;
	//int cR = arr[0].r;
	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/*cR*/) {
			if (localMax > maxS) {

				while (nums.size() >= 2) {
					auto it = nums.rbegin();
					Member* m2 = &arr[*it];
					Member* m1 = &arr[*(++it)];
					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) {
						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;
			//cR = arr[k + 1].r;
		}
	}
	vector<int> res;
	//std::copy(begin(nums), end(nums), std::back_inserter(res));
	for (auto it : nums) {
		res.push_back(arr[it].id);
	}
	std::sort(begin(res), end(res));
	for (auto m : res) {
		cout << m << " ";
	}

	return 0;
}
#else
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 maxSId;
	int localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = k;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							//9787 9996 9788 1199 180599 9786 5569 9995 9927 9995
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << " " << maxS << " " << arr[maxSId].r << " " << arr[maxSId].s << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
				maxSId = localId;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}
#endif


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>

using namespace std;

struct Member {
	int s;
	int r;
	int id;
};

Member arr[2 * 100000];

#if 1
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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;
	//int cR = arr[0].r;
	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/*cR*/) {
			if (localMax > maxS) {

				while (nums.size() >= 2) {
					auto it = nums.rbegin();
					Member* m2 = &arr[*it];
					Member* m1 = &arr[*(++it)];
					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) {
						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;
			//cR = arr[k + 1].r;
		}
	}
	vector<pair<int,int>> res;
	//std::copy(begin(nums), end(nums), std::back_inserter(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 = res.size() && res[0].second == 10296;
	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;
}
#else
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 maxSId;
	int localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = k;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							//9787 9996 9788 1199 180599 9786 5569 9995 9927 9995
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << " " << maxS << " " << arr[maxSId].r << " " << arr[maxSId].s << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
				maxSId = localId;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}
#endif


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>

using namespace std;

struct Member {
	int s;
	int r;
	int id;
};

Member arr[2 * 100000];

#if 1
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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;
	//int cR = arr[0].r;
	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/*cR*/) {
			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;
			//cR = arr[k + 1].r;
		}
	}
	vector<pair<int,int>> res;
	//std::copy(begin(nums), end(nums), std::back_inserter(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; // res.size() && res[0].second == 10296;
	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;
}
#else
int main(int argc, char **argv) {

	cout.sync_with_stdio(false);
	cin.sync_with_stdio(false);

	istream *pinp;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 maxSId;
	int localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = k;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							//9787 9996 9788 1199 180599 9786 5569 9995 9927 9995
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << " " << maxS << " " << arr[maxSId].r << " " << arr[maxSId].s << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
				maxSId = localId;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}
#endif


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 localMax = -1;
	//int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			//localId = arr[k].id;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << maxS << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}


#include <iostream>
#include <memory>
#include <fstream>
#include <algorithm>
#include <vector>

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;
#ifndef ONLINE_JUDGE
	unique_ptr<istream> stream;
	if (argc > 1) {
		pinp = new ifstream(argv[1]);
		stream.reset(pinp);
	}
	else
#endif
	{
		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 maxSId;
	int localMax = -1;
	int localId;
	vector<int> nums;
	//int cR = arr[0].r;
	for (int k = 0; k < num; k++)
	{
		if (arr[k].s > localMax) {
			localMax = arr[k].s;
			localId = k;
		}

		if (k == num-1 || arr[k+1].r != arr[k].r/*cR*/) {
			if (localMax > maxS) {
				for (int s = start; s <= k; s++) {
					if (arr[s].s == localMax) {
						if (arr[s].id == 58320)
							cout << arr[s].r << " " << arr[s].s << " " << arr[start - 1].r << " " << arr[start - 1].s << " " << arr[k + 1].id << " " << arr[k + 1].r << " " << arr[k + 1].s << " " << maxS << " " << arr[maxSId].r << " " << arr[maxSId].s << " ";

						nums.push_back(arr[s].id);
					}
				}
				maxS = localMax;
				maxSId = localId;
			}
			localMax = -1;
			start = k + 1;
			//cR = arr[k + 1].r;
		}
	}
	std::sort(begin(nums), end(nums));
	for (auto m : nums) {
		cout << m << " ";
	}

	return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#include<algorithm>
#define ll long long
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
using namespace std;
inline int gi(){
	int sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
inline ll gl(){
	ll sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
struct P{
	int x,y,id;
	bool operator<(const P RENA)const{
		return x>RENA.x || (x==RENA.x && y>RENA.y);
	}
}p[300010];
long double k[300010];
int q[300010],t,ne[300010],f[300010];
long double Slope(P a,P b){
	return (long double)a.x*b.x*(b.y-a.y)/((long double)a.y*b.y*(b.x-a.x));
}
int main(){
#ifndef ONLINE_JUDGE
	file("slay");
#endif
    int i,j,n,m;
	n=gi();int Y=0,X;
	for(i=1;i<=n;i++){
		p[i].x=gi();p[i].y=gi();p[i].id=i;
		if(Y<p[i].y || (Y==p[i].y && X<p[i].x))
			X=p[i].x,Y=p[i].y;
	}
	sort(p+1,p+n+1);q[t=1]=1;
	for(int i=2;i<=n && X<=p[i].x;i++){
		if(p[q[t]].x==p[i].x){
			if(p[q[t]].y==p[i].y){
				ne[p[i].id]=ne[p[q[t]].id];
				ne[p[q[t]].id]=p[i].id;
			}
			continue;
		}
		while(t>1 && k[t]>Slope(p[q[t]],p[i]))t--;
		q[++t]=i;k[t]=Slope(p[q[t-1]],p[i]);
	}
	for(;t;t--)
		for(i=p[q[t]].id;i;i=ne[i]){
			f[i]=1;
		}
	for(i=1;i<=n;i++)if(f[i])printf("%d ",i);
	puts("");
	return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#include<algorithm>
#define ll long long
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
using namespace std;
inline int gi(){
	int sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
inline ll gl(){
	ll sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
long double a[300010],b[300010];
int main(){
#ifndef ONLINE_JUDGE
	file("slay");
#endif
    int i,j,k,n,m;
	n=gi();
	for(i=1;i<=n;i++)scanf("%Lf%Lf",&a[i],&b[i]);
	for(i=1;i<=n;i++){
		int flag=1;
		long double Max=-1e27,Min=1e27;
		for(j=1;j<=n;j++)
			if(i!=j){
				if(a[i]==a[j] && b[i]==b[j])continue;
				int ff1=a[j]>a[i],ff2=b[i]>b[j];
				if(ff1==1 && ff2==0){flag=0;break;}
				int LittleBoSon=a[j]<a[i];//璐熸暟
				if(LittleBoSon){
					Max=max(Max,((b[i]-b[j])*a[i]*a[j]/(b[i]*b[j]*((a[j]-a[i])))));
					if(Min<Max)break;
				}
				else{
					Min=min(Min,((b[i]-b[j])*a[i]*a[j]/(b[i]*b[j]*((ll)(a[j]-a[i])))));
					if(Min<Max)break;
				}
			}
		if(Min<Max)flag=0;
		if(flag)printf("%d ",i);
	}
	puts("");
	return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#include<algorithm>
#define ll long long
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
using namespace std;
inline int gi(){
	int sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
inline ll gl(){
	ll sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
struct P{
	int x,y,id;
	bool operator<(const P RENA)const{
		return x>RENA.x || (x==RENA.x && y>RENA.y);
	}
}p[300010];
long double k[300010];
int q[300010],t,ne[300010],f[300010];
long double Slope(P a,P b){
	return (long double)a.x*b.x*(b.y-a.y)/((long double)a.y*b.y*(b.x-a.x));
}
int main(){
#ifndef ONLINE_JUDGE
	file("slay");
#endif
    int i,j,n,m;
	n=gi();int Y=0,X;
	for(i=1;i<=n;i++){
		p[i].x=gi();p[i].y=gi();p[i].id=i;
		if(Y<p[i].y || (Y==p[i].y && X<p[i].x))
			X=p[i].x,Y=p[i].y;
	}
	sort(p+1,p+n+1);q[t=1]=1;
	for(int i=2;i<=n && X<=p[i].x;i++){
		if(p[q[t]].x==p[i].x){
			if(p[q[t]].y==p[i].y){
				ne[p[i].id]=ne[p[q[t]].id];
				ne[p[q[t]].id]=p[i].id;
			}
			continue;
		}
		while(t>1 && k[t]>Slope(p[q[t]],p[i]))t--;
		q[++t]=i;k[t]=Slope(p[q[t-1]],p[i]);
	}
	for(;t;t--)
		for(i=p[q[t]].id;i;i=ne[i]){
			f[i]=1;
		}
	for(i=1;i<=n;i++)if(f[i])printf("%d ",i);
	puts("");
	return 0;
}
//AC


#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;

const int N = 2e5 + 10;
typedef pair<int, int>pii;
typedef pair<double, double>pdd;
int x[N], y[N], n;
pii p[N], ch[N];
set<pii>s;
bool cmp(pii a, pii b) {
    if (a.fi == b.fi) return a.se > b.se;
    return a.fi > b.fi;
}
bool cross(pii p1, pii p2, pii pi) {
    pdd tmp1 = {10000.0 * (p2.fi - p1.fi) / (p1.fi * p2.fi), 10000.0 * (p2.se - p1.se) / (p1.se * p2.se)};
    pdd tmp2 = {10000.0 * (p2.fi - pi.fi) / (pi.fi * p2.fi), 10000.0 * (p2.se - pi.se) / (pi.se * p2.se)};
    return (tmp1.fi * tmp2.se - tmp1.se * tmp2.fi) < 0;
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d%d", x + i, y + i);
        p[i] = {x[i], y[i]};
    }
    sort(p, p + n, cmp);
    int tot = 1, top = 0;
    for (int i = 1; i < n; ++ i)
        if (p[i].se > p[tot - 1].se)
            p[tot++] = p[i];

    for (int i = 0; i < tot; i++) {
        while (top > 1 && cross(ch[top - 1], ch[top - 2], p[i])) top--;
        ch[top++] = p[i];
    }
    for (int i = 0; i < top; i++) s.insert(ch[i]);
    for (int i = 0; i < n; i++) if (s.find({x[i], y[i]}) != s.end()) printf("%d ", i + 1);
}


#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;

const int N = 2e5 + 10;
typedef pair<int, int>pii;
typedef pair<double, double>pdd;
int x[N], y[N], n;
pii p[N], ch[N];
set<pii>s;
bool cmp(pii a, pii b) {
    if (a.fi == b.fi) return a.se > b.se;
    return a.fi > b.fi;
}
bool cross(pii p1, pii p2, pii pi) {
    pdd tmp1 = {10000.0 * (p2.fi - p1.fi) / (p1.fi * p2.fi), 10000.0 * (p2.se - p1.se) / (p1.se * p2.se)};
    pdd tmp2 = {10000.0 * (p2.fi - pi.fi) / (pi.fi * p2.fi), 10000.0 * (p2.se - pi.se) / (pi.se * p2.se)};
    return (tmp1.fi * tmp2.se - tmp1.se * tmp2.fi) <= 0;
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d%d", x + i, y + i);
        p[i] = {x[i], y[i]};
    }
    sort(p, p + n, cmp);
    int tot = 1, top = 0;
    for (int i = 1; i < n; ++ i)
        if (p[i].se > p[tot - 1].se)
            p[tot++] = p[i];

    for (int i = 0; i < tot; i++) {
        while (top > 1 && cross(ch[top - 1], ch[top - 2], p[i])) top--;
        ch[top++] = p[i];
    }
    for (int i = 0; i < top; i++) s.insert(ch[i]);
    for (int i = 0; i < n; i++) if (s.find({x[i], y[i]}) != s.end()) printf("%d ", i + 1);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, int> pdi;

const double EPS = 1e-11;
const double inf = 1/.0;

bool Q;
struct Line {
	mutable double k, m, p;
	mutable int idx;
	bool operator<(const Line& o) const {
		return Q ? p < o.p : k < o.k;
	}
};

struct LineContainer : multiset<Line> {
	double div(double a, double b) { // floored division
		return a / b;
	}
	bool isect(iterator x, iterator y) {
		if (y == end()) { x->p = inf; return false; }
		if (x->k == y->k) x->p = x->m > y->m ? inf : -inf;
		else x->p = div(y->m - x->m, x->k - y->k);
		return x->p >= y->p;
	}
	void add(double k, double m, int idx) {
		auto z = insert({k, m, 0, idx}), y = z++, x = y;
		while (isect(y, z)) z = erase(z);
		if (x != begin() && isect(--x, y)) isect(x, y = erase(y));
		while ((y = x) != begin() && (--x)->p >= y->p)
			isect(x, erase(y));
	}
	double query(double x) {
		assert(!empty());
		Q = 1; auto l = *lower_bound({0,0,x,0}); Q = 0;
		return l.k * x + l.m;
	}
};

int main() {
	cin.sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	vector<pair<pii, int> > rs(n);
	for (int i = 0; i < n; i++) {
		cin >> rs[i].first.second >> rs[i].first.first;
		rs[i].second = i+1;
	}
	sort(rs.begin(), rs.end());

	LineContainer lc;
	for (int i = 0; i < n; i++) {
		lc.add(-1.0 / rs[i].first.first, -1.0 / rs[i].first.second, i);
	}

	vector<pdi> pi;
	for (auto it = lc.rbegin(); it != lc.rend(); it++) {
		//cout << setprecision(10) << it -> k << " " << it -> m << " " << it -> p << " " << it -> idx << endl;
		if (it -> p > EPS) {
			pi.push_back(make_pair(it->p, it->idx));
		} else {
			break;
		}
	}
	set<int> idxs;
	for (int i = 0; i < n; i++) {
		while (!pi.empty() && rs[i].first.first > rs[pi.back().second].first.first) pi.pop_back();
		assert(!pi.empty());
		pii cr = rs[i].first;
		pii qr = rs[pi.back().second].first;
		if (cr.first == qr.first && cr.second == qr.second) {
			idxs.insert(rs[i].second);
		} else if (cr.first < qr.first) {
			double pval = pi.back().first;
			if (pval < inf) {
				if (abs((-pval / cr.first - cr.second) - (-pval / qr.first - qr.second)) < EPS) {
					idxs.insert(rs[i].second);
				}
			}
		}
	}
	for (auto it = idxs.begin(); it != idxs.end(); it++) {
		cout << *it << " ";
	}

	return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 555555
struct whs{
	double x,y;
	ll id;
	friend bool operator < (const whs &a,const whs &b){
		return a.x==b.x?a.y<b.y:a.x<b.x;
	}
}node[A],p[A];
vector <ll> id[A];
vector <ll> ans;
ll n,m=1,top;
ll sta[A];
double cal(ll a,ll b){
//	printf("a=%lld b=%lld\n",a,b);
	return ((p[a].y-p[b].y)/((p[a].x-p[b].x)));
}
int main(){
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++){
		scanf("%lf%lf",&node[i].x,&node[i].y);
		node[i].x=1/node[i].x;
		node[i].y=1/node[i].y;
		node[i].id=i;
	}
	sort(node+1,node+n+1);
	p[1]=node[1];
	m=1;
	for(ll i=2;i<=n;i++){

		if(node[i].x-node[i-1].x>1e-9)
			p[++m]=node[i];
		else if(node[i].y-node[m].y<=1e-9)
			id[p[m].id].push_back(node[i].id);
	}
	sta[1]=1,sta[2]=2;top=2;
	for(ll i=3;i<=m;i++){
		while(top>1&&cal(sta[top-1],sta[top])>cal(sta[top-1],i))
			top--;
//		printf("i=%lld top=%lld\n",i,top);
		sta[++top]=i;
	}
//	printf("top=%lld\n",top);
	ans.push_back(p[sta[1]].id);
	for(ll j=0;j<id[p[sta[1]].id].size();j++)
		ans.push_back(id[p[sta[1]].id][j]);
	for(ll i=2;i<=top;i++){
//		printf("sta[%lld]=%lld\n",i,sta[i]);
		if(cal(sta[i-1],sta[i])<0){
			ans.push_back(p[sta[i]].id);
//			printf("p[%lld].id=%lld\n",sta[i],p[sta[i]].id);
			for(ll j=0;j<id[p[sta[i]].id].size();j++){
				ans.push_back(id[p[sta[i]].id][j]);
//			printf("%lld\n",id[p[sta[i]].id][j]);
			}
		}
		else break;
	}
	sort(ans.begin(),ans.end());
//	printf("ans.size()=%lld\n",ans.size()*1ll);
	for(ll i=0;i<ans.size();i++){
		printf("%lld ",ans[i]);
	}
	printf("\n");
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 555555
struct whs{
	double x,y;
	ll id;
	friend bool operator < (const whs &a,const whs &b){
		return a.x==b.x?a.y<b.y:a.x<b.x;
	}
}node[A],p[A];
vector <ll> id[A];
vector <ll> ans;
ll n,m=1,top;
ll sta[A];
double cal(ll a,ll b){
//	printf("a=%lld b=%lld %lf\n",a,b,((p[a].y-p[b].y)/(p[a].x-p[b].x)));
	return ((p[a].y-p[b].y)/((p[a].x-p[b].x)));
}
int main(){
//	freopen("slay4.in","r",stdin);
//	freopen("zj.out","w",stdout);
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++){
		scanf("%lf%lf",&node[i].x,&node[i].y);
		node[i].x=100000000/node[i].x;
		node[i].y=100000000/node[i].y;
		node[i].id=i;
	}
	sort(node+1,node+n+1);
	p[1]=node[1];
	m=1;
	for(ll i=2;i<=n;++i){
		if(node[i].x!=node[i-1].x)
			p[++m]=node[i];
		else if(node[i].y==p[m].y)
			id[p[m].id].push_back(node[i].id);
	}
//	for(ll i=1;i<=n;i++){
//		printf("i=%lld p[%lld ",i,p[i].id);
//		for(ll j=0;j<id[i].size();j++){
//			printf("p[%lld ",id[i][j]);
//		}
//		printf("\n");
//	}
	sta[1]=1,sta[2]=2;top=2;
	for(ll i=3;i<=m;i++){
		while(top>1&&cal(sta[top-1],sta[top])>cal(sta[top-1],i))
			top--;
		sta[++top]=i;
//		printf("i=%lld top=%lld\n",i,top);
	}
//	printf("top=%lld\n",top);
	ans.push_back(p[sta[1]].id);
	for(ll j=0;j<id[p[sta[1]].id].size();j++)
		ans.push_back(id[p[sta[1]].id][j]);
//	for(ll j=0;j<ans.size();j++){
//		printf("***************%lld \n",ans[j]);
//	}
	//printf("***id[%lld][%lld]=%lld\n",p[sta[1]].id,j,id[p[sta[1]].id][j]);
	for(ll i=2;i<=top;i++){
//		printf("sta[%lld]=%lld\n",i,sta[i]);
		if(cal(sta[i-1],sta[i])<0){
			ans.push_back(p[sta[i]].id);
//			printf("p[%lld].id=%lld\n",sta[i],p[sta[i]].id);
			for(ll j=0;j<id[p[sta[i]].id].size();j++){
				ans.push_back(id[p[sta[i]].id][j]);
//			printf("%lld\n",id[p[sta[i]].id][j]);
			}
		}
		else break;
	}
	sort(ans.begin(),ans.end());
//	printf("ans.size()=%lld\n",ans.size()*1ll);
	for(ll i=0;i<ans.size();i++){
		printf("%lld ",ans[i]);
	}
	printf("\n");
}


#include <iostream>
#include <cstdio>
#include <algorithm>

struct Node{
	double x, y;
	Node *ne;
	int id;
	double friend Slope(const Node &_, const Node &__){
		return (double)(_.x*__.x*(_.y-__.y)) / (_.y*__.y*(_.x-__.x));
	}
}a[300010], rn, *s[300010];

int n, top;

bool fl[300010];

bool cmp(const Node &_, const Node &__){return _.x==__.x ? _.y>__.y : _.x>__.x;}

int main(){
	scanf("%d", &n);
	rn.x=0, rn.y=0;
	for(int i=1; i<=n; i++){
		scanf("%lf%lf", &a[i].x, &a[i].y);
		if(a[i].y>rn.y || (a[i].y==rn.y && a[i].x>rn.x))
			rn=a[i];
		a[i].id=i;
	}
	std::sort(a+1, a+n+1, cmp);
	s[++top]=&a[1];
	for(int i=2; i<=n && a[i].x>=rn.x; i++){
		if(a[i].x==s[top]->x){
			if(a[i].y==s[top]->y)
				a[i].ne=s[top]->ne, s[top]->ne=&a[i];
			continue;
		}
		while(top>1 && Slope(*s[top-1], *s[top])>Slope(*s[top], a[i]))
			top--;
		s[++top]=&a[i];
	}
	for(; top; top--)
		for(Node *i=s[top]; i; i=i->ne)
			fl[i->id]=true;
	for(int i=1; i<=n; i++) if(fl[i]) printf("%d ", i);
	return 0;
}


#include<bits/stdc++.h>
#define R register int
#define ll long long
#define db double
using namespace std;
const int N=500001;
const db eps=1e-15;
int n,vis[N],ans[N];
map<db,int>Mx,id;
struct Qs{db a,b;}Q[N];
int gi(){
    R x=0,k=1;char c=getchar();
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')k=-1,c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*k;
}
int check(R i){
	db le=eps,ri=1e9;
	for(R j=1;j<=n;++j)
		if(j!=i){
			if(Q[i].a==Q[j].a){
				if(Q[i].b>=Q[j].b)continue;
				return 0;
			}
			db z=(Q[i].a*Q[j].a)/(Q[j].a-Q[i].a);
			db y=z*(Q[i].b-Q[j].b)/(Q[i].b*Q[j].b);
			if(z<(-eps))le=max(le,y);
			else ri=min(ri,y);
			if(le>ri)return 0;
		}
	if(le>ri)return 0;
	return 1;
}
int main(){
	n=gi();
	for(R i=1;i<=n;++i){
		scanf("%lf %lf",&Q[i].a,&Q[i].b);
		if(Mx.find(Q[i].a)!=Mx.end())Mx[Q[i].a]=Q[i].b,id[Q[i].a]=i;
		else if(Mx[Q[i].a]>Q[i].b)vis[i]=-1;
		else if(Mx[Q[i].a]<Q[i].b){
			vis[id[Q[i].a]]=i;
			Mx[Q[i].a]=Q[i].b,id[Q[i].a]=i;
		}
		else vis[i]=id[Q[i].a];
	}
	for(R i=1;i<=n;++i){
		if(vis[i]==-1)continue;
		else if(vis[i]>0){
				if(ans[vis[i]])printf("%d ",i);
				continue;
			}
		if(check(i))printf("%d ",i),ans[i]=1;
	}
	return 0;
}


#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <limits>
#include <climits>
#include <cstdio>
#include <complex>
#include <numeric>
#include <cassert>
#define endl '\n'
#define mp(x,y) make_pair((x),(y))
#define PI pair<int,int>
#define	PD pair<double,double>
#define PDI pair<double,int>
#define ll long long
#define ull unsigned long long
#define Fori(x) for(int i=0;i<(x);i++)
#define Forj(x) for(int j=0;j<(x);j++)
#define For1i(x) for(int i=1;i<=(x);i++)
#define For1j(x) for(int j=1;j<=(x);j++)
#define y1 asdfeawf
using namespace std;
const int INF = 2147483647;
const int mod = 1000000007;
//const double eps= 1e-8;
const double pi = acos(-1.0);

/*struct node
{
	int x,y;
	int ind;
}ns[200022];
bool cmp(node a,node b)
{
	if(a.x==b.x)
		return a.y>b.y;
	return a.x>b.x;
}*/
int a[200022];
int b[200022];
int f[10011];
int ans[10011];
int p[200022];
int top = 0;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	int mx = 0;
	Fori(n)
	{
		int l,r;
		cin>>l>>r;
		mx = max(mx,l);
		a[i] = l;
		b[i] = r;
		f[l] = max(f[l],r);
	}

	for(int i=mx;i>0;i--)
	{
		if(f[i]==0) continue;
		if(top==0)
		{
			p[top++] = i;
			continue;
		}
		if(f[i]<=f[p[top-1]]) continue;
		while(top>=2&& 1LL*abs(f[i]-f[p[top-1]])*abs(p[top-1]-p[top-2])> 1LL*abs(i-p[top-1])*abs(f[p[top-1]] - f[p[top-2]]) )
			top--;
		p[top++] = i;
	}
	for(int i=0;i<top;i++)
		ans[p[i]] = 1;

	Fori(n)
	{
		if(ans[a[i]]==0) continue;
		if(b[i]==f[a[i]]) cout<<i+1<<" ";
	}
	return 0;
}


#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <limits>
#include <climits>
#include <cstdio>
#include <complex>
#include <numeric>
#include <cassert>
#define endl '\n'
#define mp(x,y) make_pair((x),(y))
#define PI pair<int,int>
#define	PD pair<double,double>
#define PDI pair<double,int>
#define ll long long
#define ull unsigned long long
#define Fori(x) for(int i=0;i<(x);i++)
#define Forj(x) for(int j=0;j<(x);j++)
#define For1i(x) for(int i=1;i<=(x);i++)
#define For1j(x) for(int j=1;j<=(x);j++)
#define y1 asdfeawf
using namespace std;
const int INF = 2147483647;
const int mod = 1000000007;
const double eps= 1e-8;
const double pi = acos(-1.0);

/*struct node
{
	int x,y;
	int ind;
}ns[200022];
bool cmp(node a,node b)
{
	if(a.x==b.x)
		return a.y>b.y;
	return a.x>b.x;
}*/
int a[200022];
int b[200022];
int f[10011];
int ans[10011];
int p[200022];
int top = 0;

int sgn(double x)
{
	return x>eps?1:x<-eps?-1:0;
}

bool fun(int yy3,int xx3,int yy2,int xx2,int yy1,int xx1)
{
	double y3 = 1.0/yy3;
	double x3 = 1.0/xx3;
	double y2 = 1.0/yy2;
	double x2 = 1.0/xx2;
	double y1 = 1.0/yy1;
	double x1 = 1.0/xx1;
	double k1 = (y3-y2)/(x3-x2);
	double k2 = (y2-y1)/(x2-x1);
	if(sgn(k1-k2)<0)
		return true;
	return false;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	int mx = 0;
	Fori(n)
	{
		int l,r;
		cin>>l>>r;
		mx = max(mx,l);
		a[i] = l;
		b[i] = r;
		f[l] = max(f[l],r);
	}

	for(int i=mx;i>0;i--)
	{
		if(f[i]==0) continue;
		if(top==0)
		{
			p[top++] = i;
			continue;
		}
		if(f[i]<=f[p[top-1]]) continue;
		while(top>=2&& fun(f[i],i,f[p[top-1]],p[top-1],f[p[top-2]],p[top-2]))//1LL*abs(f[i]-f[p[top-1]])*abs(p[top-1]-p[top-2])> 1LL*abs(i-p[top-1])*abs(f[p[top-1]] - f[p[top-2]]) )
			top--;
		p[top++] = i;
	}
	for(int i=0;i<top;i++)
		ans[p[i]] = 1;

	Fori(n)
	{
		if(ans[a[i]]==0) continue;
		if(b[i]==f[a[i]]) cout<<i+1<<" ";
	}
	return 0;
}


#include  <bits/stdc++.h>
#define  i64  long long
#define  PB push_back
#define  MP make_pair
#define  sec  second
#define  fir  first
using  namespace  std;

typedef  pair<int,int>  pii;
typedef  vector<int>  vi;

pii  o,oo,stk[20010];
vector<pii>  pnt;
vi  ans;
map<pii,vi>  mp;
int  tt,top,n,xx,yy;

bool  cmp1(pii  i,pii j){
	if  (i.sec != j.sec)  return  i.sec > j.sec;
	return  i.fir > j.fir;
}

bool  cmp2(pii  i,pii  j){
	return  i > j;
}

int  cj(pii i,pii j,pii k){
	pii t1 = MP(j.fir-i.fir,j.sec-i.sec),t2 = MP(k.fir-i.fir,k.sec-i.sec);
	return  t1.fir*t2.sec - t1.sec*t2.fir;
}

i64  sqr(int  xx){return  xx*xx;}

bool  cmp3(pii  i,pii  j){
	pii t1 = MP(i.fir-o.fir,i.sec-o.sec),t2 = MP(j.fir-o.fir,j.sec-o.sec);
	int  tmp = t1.fir*t2.sec - t1.sec*t2.fir;
	if  (tmp == 0)  return  sqr(t1.fir)+sqr(t1.sec) < sqr(t2.fir)+sqr(t2.sec);
	return  tmp < 0;
}

int  main(){
	scanf("%d",&n);
	for  (int  i = 1;i <= n; i++){
		scanf("%d%d",&xx,&yy);
		mp[MP(xx,yy)].PB(i);
	}
	if  (mp.size() == 1){
		for  (int  i = 1;i <= n; i++)  printf("%d ",i);
		exit(0);
	}
	for  (map<pii,vi>::iterator  p = mp.begin();p != mp.end(); p++)
		pnt.PB(MP((p->fir).fir,(p->fir).sec));
	sort(pnt.begin(),pnt.end(),cmp1);
	o = pnt[0];
	sort(pnt.begin(),pnt.end(),cmp2);
	oo = pnt[0];
	if  (o == oo){
		for  (vi::iterator  p = mp[o].begin();p != mp[o].end(); p++)
			printf("%d ",*p);
		exit(0);
	}
	sort(pnt.begin(),pnt.end(),cmp3);
	stk[++top] = pnt[0];stk[++top] = pnt[1];
	tt = top;
	while  (tt < pnt.size() && stk[top] != oo){
		while  (top > 1 && cj(stk[top-1],stk[top],pnt[tt]) > 0)  top--;
		stk[++top] = pnt[tt++];
	}
	for  (int  i = 1;i <= top; i++)
		for  (vi::iterator  p = mp[stk[i]].begin();p != mp[stk[i]].end(); p++)
			ans.PB(*p);
	sort(ans.begin(),ans.end());
	for  (int  i = 0,ed = ans.size();i < ed; i++)
		printf("%d ",ans[i]);
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) > (b); --(i))
#define rep(i, c)  for(auto &(i) : (c))
#define x     first
#define y     second
#define pb  push_back
#define PB  pop_back()
#define iOS  ios_base::sync_with_stdio(false)
#define sqr(a)  (((a) * (a)))
#define all(a)  a.begin() , a.end()
#define error(x) cerr << #x << " = " << (x) <<endl
#define Error(a,b) cerr<<"( "<<#a<<" , "<<#b<<" ) = ( "<<(a)<<" , "<<(b)<<" )\n";
#define errop(a) cerr<<#a<<" = ( "<<((a).x)<<" , "<<((a).y)<<" )\n";
#define coud(a,b) cout<<fixed << setprecision((b)) << (a)
#define L(x)  ((x)<<1)
#define R(x)  (((x)<<1)+1)
#define umap  unordered_map
//#define max(x,y)  ((x) > (y) ? (x) : (y))
#define double long double
typedef long long ll;
typedef pair<int,int>pii;
typedef vector<int> vi;
//typedef complex<double> point;
const int maxn = 1e6 + 100;
map <pii, vi> mp;
const double eps = 1e-22;
struct point{
	int X,Y;
	double x,y;
	point(){
		X = Y = x = y = .0;
	}
	point(double a,double b){
		x = a, y = b;
	}
	inline void init(int a,int b){
		X = a, Y = b;
		x = 1.0 / X;
		y = 1.0 / Y;
	}
	inline double operator * (point p){
		return x * p.y - y * p.x;
	}
	inline point operator - (point p){
		return point(x - p.x, y - p.y);
	}
	inline double dis(point p){
		return sqr(x - p.x) + sqr(y - p.y);
	}
	inline pii PII(){
		return pii(X, Y);
	}
};
point o;
point l;
inline bool ocmp(const point &a, const point &b){
	return make_pair(a.y, a.x) < make_pair(b.y, b.x);
}
inline bool lcmp(const point &a, const point &b){
	return make_pair(a.x, a.y) < make_pair(b.x, b.y);
}
inline bool scmp(const point &a,const point &b){
	double cross = ((point)a - o) * ((point)b - o);
	if(fabs(cross) <= eps)
		return o.dis(a) < o.dis(b);
	return cross < eps;
}
vector<point> v;
vector<point> hull;
int n;
int main(){
    iOS;
	cin >> n;
	For(i,0,n){
		int a,b;
		cin >> a >> b;
		mp[{a, b}].pb(i + 1);
	}
	if(mp.size() == 1){
		For(i,1,n+1)
			cout << i << ' ';
		cout << endl;
		return 0;
	}
	Foreach(q, mp){
		pii p = q->x;
		int x = p.x, y = p.y;
		point P;
		P.init(x, y);
		v.pb(P);
	}
	o = *min_element(all(v), ocmp);
	l = *min_element(all(v), lcmp);
	if(o.PII() == l.PII()){
		rep(a, mp[o.PII()])
			cout << a << ' ';
		cout << endl;
		return 0;
	}
	sort(all(v), scmp);
	int po = 2;
	For(i,0,2)
		hull.pb(v[i]);
	vi ans;
	while(po < v.size() && hull.back().PII() != l.PII()){
		while(hull.size() > 1 && (hull[hull.size()-1] - hull[hull.size()-2]) * (v[po] - hull[hull.size()-2]) > eps)
			hull.PB;
		hull.pb(v[po++]);
	}
	rep(p, hull)
		rep(a, mp[p.PII()])
			ans.pb(a);
	sort(all(ans));
	rep(a, ans)
		cout << a << ' ';
	cout << endl;

}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-22
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    int xx, yy;
    ld x, y;
    point(ld x = 0, ld y = 0) {
        this->x = x;
        this->y = y;
    }
    void init(int xx, int yy) {
        this->xx = xx, this->yy = yy;
        x = 1.0 / xx;
        y = 1.0 / yy;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.xx == xx && p.yy == yy;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ld crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > EPS) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > EPS) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

map<II, vector<int> > ma;
vector<int> res;
int n;
point leftMost, downMost;

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    FOR(i,1,n) {
        int a, b;
        cin >> a >> b;
        ma[II(a,b)].pb(i);
    }
    if (sz(ma) == 1) {
        FOR(i,1,n) cout << i << " ";
        return 0;
    }
    FORALL(it, ma) {
        II z = it->X;
        point p;
        p.init(z.X, z.Y);
        a.pb(p);
    }
    convexHull();

    leftMost = downMost = ch[0];

    //FOR(i,0,sz(ch)-1) cout << ch[i].x << ' ' << ch[i].y << endl;

    FOR(i,1,sz(ch)-1)
        if (ch[i].x < leftMost.x) leftMost = ch[i];
        else if (leftMost.x == ch[i].x && leftMost.y > ch[i].y) leftMost = ch[i];
    FOR(i,1,sz(ch)-1)
        if (ch[i].y < downMost.y) downMost = ch[i];
        else if (downMost.y == ch[i].y && downMost.x > ch[i].x) downMost = ch[i];

    //cout << leftMost.x << " " << leftMost.y << endl;
    //cout << downMost.x << " " << downMost.y << endl;

    if (sz(ch) == 3) {
        if (crossProduct(ch[0], ch[1], ch[2]) > EPS) reverse(all(ch));
    }
    FOR(i,0,sz(ch)-1)
        if (ch[i] == leftMost) {
            int u = i;
            while (1) {
                vector<int> z = ma[II(ch[u].xx, ch[u].yy)];
                FOR(j,0,sz(z)-1) res.pb(z[j]);
                if (ch[u] == downMost) break;
                u = (u - 1 + sz(ch)) % sz(ch);
            }
            break;
        }
    sort(all(res));
    FOR(i,0,sz(res)-1) cout << res[i] << " ";
    return 0;
}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-22
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    int xx, yy;
    ld x, y;
    point(ld x = 0, ld y = 0) {
        this->x = x;
        this->y = y;
    }
    void init(int xx, int yy) {
        this->xx = xx, this->yy = yy;
        x = 1.0 / xx;
        y = 1.0 / yy;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.xx == xx && p.yy == yy;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ld crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > EPS) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > EPS) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

map<II, vector<int> > ma;
vector<int> res;
int n;
point leftMost, downMost;

bool dcmp(const point &a, const point &b){
	return make_pair(a.y, a.x) < make_pair(b.y, b.x);
}
bool lcmp(const point &a, const point &b){
	return make_pair(a.x, a.y) < make_pair(b.x, b.y);
}

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    FOR(i,1,n) {
        int a, b;
        cin >> a >> b;
        ma[II(a,b)].pb(i);
    }
    if (sz(ma) == 1) {
        FOR(i,1,n) cout << i << " ";
        return 0;
    }
    FORALL(it, ma) {
        II z = it->X;
        point p;
        p.init(z.X, z.Y);
        a.pb(p);
    }
    convexHull();

    leftMost = *min_element(all(a), lcmp);
    downMost = *min_element(all(a), dcmp);

    FOR(i,0,sz(ch)-1)
        if (ch[i] == leftMost) {
            int u = i;
            while (1) {
                vector<int> z = ma[II(ch[u].xx, ch[u].yy)];
                FOR(j,0,sz(z)-1) res.pb(z[j]);
                if (ch[u] == downMost) break;
                u = (u - 1 + sz(ch)) % sz(ch);
            }
            break;
        }

    sort(all(res));
    FOR(i,0,sz(res)-1) cout << res[i] << " ";
    return 0;
}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-9
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    ll x, y;
    int cs;
    point(ll x = 0, ll y = 0) {
        this->x = x;
        this->y = y;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.x == x && p.y == y;
    }
    bool operator< (const point &p) const {
        if (y == p.y) return x < p.x;
        return y < p.y;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ll crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > 0) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > 0) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

bool cmp(point a, point b)
{
    return a.cs < b.cs;
}

map<II, vector<int> > ma;

int n;

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    a.pb(point());
    ll MaxX = 0, MaxY = 0;
    FOR(i,1,n) {
        point p;
        cin >> p.x >> p.y;
        MaxX = max(MaxX, p.x);
        MaxY = max(MaxY, p.y);
        if (!ma.count(II(p.x, p.y))) a.pb(p);
        ma[II(p.x, p.y)].pb(i);
    }
    a.pb(point(MaxX, 0));
    a.pb(point(0, MaxY));
    ll MaxXY = 0, MaxYX = 0;
    FOR(i,0,sz(a)-1) {
        if (a[i].x == MaxX) MaxXY = max(MaxXY, a[i].y);
        if (a[i].y == MaxY) MaxYX = max(MaxYX, a[i].x);
    }
    convexHull();
    sort(all(ch), cmp);
    FOR(i,0,sz(ch)-1) {
        if (ch[i].x == 0 || ch[i].y == 0) continue;
        if (ch[i].x == MaxX && ch[i].y != MaxXY) continue;
        if (ch[i].y == MaxY && ch[i].x != MaxYX) continue;
        vector<int> z = ma[II(ch[i].x, ch[i].y)];
        FOR(j,0,sz(z)-1) cout << z[j] << " ";
    }
    return 0;
}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-9
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    ll x, y;
    int cs;
    point(ll x = 0, ll y = 0) {
        this->x = x;
        this->y = y;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.x == x && p.y == y;
    }
    bool operator< (const point &p) const {
        if (y == p.y) return x < p.x;
        return y < p.y;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ll crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > 0) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > 0) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

bool cmp(point a, point b)
{
    return a.cs < b.cs;
}

int n;

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    a.pb(point());
    ll MaxX = 0, MaxY = 0;
    FOR(i,1,n) {
        point p;
        cin >> p.x >> p.y;
        p.cs = i;
        MaxX = max(MaxX, p.x);
        MaxY = max(MaxY, p.y);
        a.pb(p);
    }
    a.pb(point(MaxX, 0));
    a.pb(point(0, MaxY));
    ll MaxXY = 0, MaxYX = 0;
    FOR(i,0,sz(a)-1) {
        if (a[i].x == MaxX) MaxXY = max(MaxXY, a[i].y);
        if (a[i].y == MaxY) MaxYX = max(MaxYX, a[i].x);
    }
    convexHull();
    sort(all(ch), cmp);
    FOR(i,0,sz(ch)-1) {
        if (ch[i].x == 0 || ch[i].y == 0) continue;
        if (ch[i].x == MaxX && ch[i].y != MaxXY) continue;
        if (ch[i].y == MaxY && ch[i].x != MaxYX) continue;
        cout << ch[i].cs << " ";
    }
    return 0;
}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-22
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    int xx, yy;
    ld x, y;
    point(ld x = 0, ld y = 0) {
        this->x = x;
        this->y = y;
    }
    void init(int xx, int yy) {
        this->xx = xx, this->yy = yy;
        x = 1.0 / xx;
        y = 1.0 / yy;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.xx == xx && p.yy == yy;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ld crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > EPS) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > EPS) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

map<II, vector<int> > ma;
vector<int> res;
int n;
point leftMost, downMost;

bool dcmp(const point &a, const point &b){
	return II(a.y, a.x) < II(b.y, b.x);
}
bool lcmp(const point &a, const point &b){
	return II(a.x, a.y) < II(b.x, b.y);
}

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    FOR(i,1,n) {
        int a, b;
        cin >> a >> b;
        ma[II(a,b)].pb(i);
    }
    if (sz(ma) == 1) {
        FOR(i,1,n) cout << i << " ";
        return 0;
    }
    FORALL(it, ma) {
        II z = it->X;
        point p;
        p.init(z.X, z.Y);
        a.pb(p);
    }
    convexHull();

    leftMost = downMost = ch[0];

    //FOR(i,0,sz(ch)-1) cout << ch[i].x << ' ' << ch[i].y << endl;

    FOR(i,1,sz(ch)-1)
        if (ch[i].x < leftMost.x) leftMost = ch[i];
        else if (leftMost.x == ch[i].x && leftMost.y > ch[i].y) leftMost = ch[i];
    FOR(i,1,sz(ch)-1)
        if (ch[i].y < downMost.y) downMost = ch[i];
        else if (downMost.y == ch[i].y && downMost.x > ch[i].x) downMost = ch[i];

    //cout << leftMost.x << " " << leftMost.y << endl;
    //cout << downMost.x << " " << downMost.y << endl;

    if (sz(ch) == 3) {
        FOR(i,0,sz(ch)-1)
            if (ch[i] == leftMost || ch[i] == downMost) {
                vector<int> z = ma[II(ch[i].xx, ch[i].yy)];
                FOR(j,0,sz(z)-1) res.pb(z[j]);
            }
            else {
                if (crossProduct(leftMost, downMost, ch[i]) > EPS) continue;
                vector<int> z = ma[II(ch[i].xx, ch[i].yy)];
                FOR(j,0,sz(z)-1) res.pb(z[j]);
            }
    }
    else {
        FOR(i,0,sz(ch)-1)
            if (ch[i] == leftMost) {
                int u = i;
                while (1) {
                    vector<int> z = ma[II(ch[u].xx, ch[u].yy)];
                    FOR(j,0,sz(z)-1) res.pb(z[j]);
                    if (ch[u] == downMost) break;
                    u = (u - 1 + sz(ch)) % sz(ch);
                }
                break;
            }
    }
    sort(all(res));
    FOR(i,0,sz(res)-1) cout << res[i] << " ";
    return 0;
}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-9
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    ll x, y;
    point(ll x = 0, ll y = 0) {
        this->x = x;
        this->y = y;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.x == x && p.y == y;
    }
    bool operator< (const point &p) const {
        if (y == p.y) return x < p.x;
        return y < p.y;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ll crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > 0) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > 0) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

map<II, vector<int> > ma;
vector<int> res;
int n;

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    a.pb(point());
    ll MaxX = 0, MaxY = 0;
    FOR(i,1,n) {
        point p;
        cin >> p.x >> p.y;
        MaxX = max(MaxX, p.x);
        MaxY = max(MaxY, p.y);
        if (!ma.count(II(p.x, p.y))) a.pb(p);
        ma[II(p.x, p.y)].pb(i);
    }
    a.pb(point(MaxX, 0));
    a.pb(point(0, MaxY));
    ll MaxXY = 0, MaxYX = 0;
    FOR(i,0,sz(a)-1) {
        if (a[i].x == MaxX) MaxXY = max(MaxXY, a[i].y);
        if (a[i].y == MaxY) MaxYX = max(MaxYX, a[i].x);
    }
    convexHull();
    FOR(i,0,sz(ch)-1) {
        if (ch[i].x == 0 || ch[i].y == 0) continue;
        if (ch[i].x == MaxX && ch[i].y != MaxXY) continue;
        if (ch[i].y == MaxY && ch[i].x != MaxYX) continue;
        vector<int> z = ma[II(ch[i].x, ch[i].y)];
        FOR(j,0,sz(z)-1) res.pb(z[j]);
    }
    sort(all(res));
    FOR(i,0,sz(res)-1) cout << res[i] << " ";
    return 0;
}


#include <bits/stdc++.h>
#define base 1000000007LL
#define ll long long
#define ld double
#define X first
#define Y second
#define pb push_back
#define EPS 1e-9
#define all(a) (a).begin(), (a).end()
#define sz(a) int((a).size())
#define ms(s, n) memset(s, n, sizeof(s))
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORE(i,a,b) for (int i = (a); i >= (b); i--)
#define FORALL(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
using namespace std;
typedef pair<int, int> II;
typedef pair<II, int> III;

struct point {
    ll x, y;
    int cs;
    point(ll x = 0, ll y = 0) {
        this->x = x;
        this->y = y;
    }
    point operator + (const point& a) const { return point(x+a.x, y+a.y); }
    point operator - (const point& a) const { return point(x-a.x, y-a.y); }
    bool operator== (point& p) {
        return p.x == x && p.y == y;
    }
    bool operator< (const point &p) const {
        if (y == p.y) return x < p.x;
        return y < p.y;
    }
};

vector<point> a;
vector<point> ch;
vector<point> upper, lower;

ll crossProduct(point first, point second, point third) { return (second.x - first.x) * (third.y - first.y) - (second.y - first.y) * (third.x - first.x); }

bool leftLower(point first, point second)
{
    if (first.x == second.x) return first.y < second.y;
    return first.x < second.x;
}

void convexHull()
{
    if (sz(a) <= 3) {
        FOR(i,0,sz(a)-1) ch.pb(a[i]);
        return;
    }
    sort(all(a), leftLower);
    upper.pb(a[0]);
    upper.pb(a[1]);
    FOR(i,2,sz(a)-1) {
        upper.pb(a[i]);
        while (sz(upper) >= 3 && crossProduct(upper[sz(upper)-3], upper[sz(upper)-2], upper[sz(upper)-1]) > 0) {
            upper.erase(upper.end()-2);
        }
    }
    FOR(i,0,sz(upper)-1) ch.pb(upper[i]);
    lower.pb(a[sz(a)-1]);
    lower.pb(a[sz(a)-2]);
    FORE(i,sz(a)-3,0) {
        lower.pb(a[i]);
        while (sz(lower) >= 3 && crossProduct(lower[sz(lower)-3], lower[sz(lower)-2], lower[sz(lower)-1]) > 0) {
            lower.erase(lower.end()-2);
        }
    }
    FOR(i,1,sz(lower)-2) ch.pb(lower[i]);
}

bool cmp(point a, point b)
{
    return a.cs < b.cs;
}

int n;

int main()
{
    ios::sync_with_stdio(0);
    //freopen("inp.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin >> n;
    a.pb(point());
    ll MaxX = 0, MaxY = 0;
    FOR(i,1,n) {
        point p;
        cin >> p.x >> p.y;
        p.cs = i;
        MaxX = max(MaxX, p.x);
        MaxY = max(MaxY, p.y);
        a.pb(p);
    }
    a.pb(point(MaxX, 0));
    a.pb(point(0, MaxY));
    convexHull();
    sort(all(ch), cmp);
    FOR(i,0,sz(ch)-1)
        if (ch[i].x && ch[i].y) cout << ch[i].cs << " ";
    return 0;
}


#include<bits/stdc++.h>
#define R register int
#define ll long long
#define db long double
using namespace std;
const int N=500001;
int n,tot,len,tp,ans[N];
vector<int>G[N];
struct Qs{int u,v,id;}w[N],Q[N],STK[N];
int cmp(const Qs &x,const Qs &y){
	if(x.u==y.u)return x.v>y.v;
	return x.u<y.u;
}
int gi(){
    R x=0,k=1;char c=getchar();
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')k=-1,c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*k;
}
db sol(Qs x,Qs y){
	db fz=(db)x.u*y.u*(x.v-y.v);
	db fm=(db)x.v*y.v*(y.u-x.u);
	return fz/fm;
}

int main(){
	n=gi();
	for(R i=1;i<=n;++i)w[i]=(Qs){gi(),gi(),i};
	sort(w+1,w+n+1,cmp);
	for(R i=1,j=1;i<=n;i=j=j+1){
		while(j<n&&w[j+1].u==w[i].u)++j;
		Q[++tot]=(Qs){w[i].u,w[i].v,tot};
		for(R k=i;k<=j&&w[k].v==w[i].v;++k)G[tot].push_back(w[k].id);
	}
	for(R i=1;i<=tot;++i){
		while(tp>1&&sol(STK[tp],STK[tp-1])>sol(Q[i],STK[tp-1]))--tp;
		STK[++tp]=Q[i];
	}
	for (R i=1;i<=tp;++i)
		if (i==tp||sol(STK[i],STK[i+1])>0){
			R x=STK[i].id;
			for(R i=0,sz=G[x].size();i<sz;++i)
				ans[++len]=G[x][i];
		}
	sort(ans+1,ans+len+1);
	for(R i=1;i<=len;++i)printf("%d ",ans[i]);
	return 0;
}


#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#define dd double
#define maxn 300300
#define ll long long
#define inf 9000000000000000000
using namespace std;
struct node{
	int a,b,id;
	dd x,y;
}q[maxn],s[maxn],qc[maxn];
int n,top,js;
bool pd[maxn];
vector <int> son[maxn];
bool cmp(const node &a,const node &b)//斜率单调增
{
	return a.x==b.x?a.y<b.y:a.x<b.x;
}
dd get(node a,node b)//a.x<b.x
{
	return (a.y-b.y)/(a.x-b.x);
}
int main()
{
//	freopen("slay4.in","r",stdin);
//	freopen("1.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d%d",&q[i].a,&q[i].b);
		q[i].id=i;
		q[i].x=(dd)1000.00000/(dd)q[i].a;
		q[i].y=(dd)1000.00000/(dd)q[i].b;
	}
	sort(q+1,q+n+1,cmp);
	int id=q[1].id,stda=q[1].a,stdb=q[1].b;  qc[++js]=q[1];
	for(int i=2;i<=n;++i)
	{
		if(q[i].a!=stda||q[i].b!=stdb)
		{
			qc[++js]=q[i];
			id=q[i].id;  stda=q[i].a;  stdb=q[i].b;
		}
		else  son[id].push_back(q[i].id);
	}
	s[++top]=qc[1];
	for(int i=2;i<=js;++i)
	{
		if(qc[i].y>=s[top].y)  continue;
		while(top!=1&&get(s[top],qc[i])<get(s[top-1],s[top]))  top--;
		s[++top]=qc[i];
	}
	for(int i=1;i<=top;++i)
	{
		int num=s[i].id;  pd[num]=1;
		for(int j=0;j<son[num].size();++j)  pd[son[num][j]]=1;
	}
	for(int i=1;i<=n;++i)
		if(pd[i])  printf("%d ",i);
	puts("");
	return 0;
}


#include<bits/stdc++.h>
#define N 200005
using namespace std;
inline int read(){
    int x=0,f=1;char g=getchar();
    while(g<'0'||g>'9'){if(g=='-')f=-1;g=getchar();}
    while(g>='0'&&g<='9'){x=(x<<1)+(x<<3)+g-48;g=getchar();}
    return f*x;
}
int n,q[N],ne[N];
long double k[N];
bool f[N];
struct node{
    int x,y,id;
    bool operator <(node a)const{
        return x>a.x||(a.x==x&&y>a.y);
    }
}p[N];
inline long double slay(node &a,node &b){
    return (long double)a.x*b.x*(b.y-a.y)/((long double)a.y*b.y*(b.x-a.x));
}
int main(){
    n=read();
    int xx,yy=0,t;
    for(int i=1;i<=n;i++){
        p[i].x=read();p[i].y=read();p[i].id=i;
        if(p[i].y>yy||(p[i].y==yy&&p[i].x<xx)){
            yy=p[i].y;xx=p[i].x;
        }
    }
    sort(p+1,p+n+1);t=1;q[1]=1;
    for(int i=2;i<=n&&xx<=p[i].x;++i){
        if(p[q[t]].x==p[i].x){
            if(p[q[t]].y==p[i].y)ne[p[i].id]=ne[p[q[t]].id],ne[p[q[t]].id]=p[i].id;
            continue;
        }
        while(t>1&&k[t]>slay(p[q[t]],p[i]))--t;
        q[++t]=i;k[t]=slay(p[q[t-1]],p[i]);
    }
    while(t){
        for(int i=p[q[t]].id;i;i=ne[i])f[i]=1;
        t--;
    }
    for(int i=1;i<=n;i++){
        if(f[i])printf("%d ",i);
    }
    printf("\n");
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define $ 1111111
ll a[$],b[$],ans[$];
ll A,B;
ll n;
double minn,maxx;
//可n^2,不等式判断
//>? <?
int main(){
//	freopen("slay3.in","r",stdin);
//	freopen("zj.out","w",stdout);
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++)
		scanf("%lld%lld",&a[i],&b[i]);
//	scanf("%lld%lld",&A,&B);
	for(ll i=1;i<=n;i++){
		minn=-123456789,maxx=12345678910;
		ll ok=1;
		for(ll j=1;j<=n;j++){
			if(j==i) continue ;
			if(a[j]<=a[i]&&b[j]<=b[i])  continue ;
			if(a[j]>=a[i]&&b[j]>b[i]) {
				ok=0;
				break;
			}
			if(a[j]>a[i]&&b[j]>=b[i]){
				ok=0;
				break;
			}
			if(a[i]>a[j]){
				minn=max(minn,1.0*(a[j])*(b[j]-b[i])/(1.0*(b[j])*(a[i]-a[j])));
			}
			else {
				maxx=min(maxx,1.0*(a[j])*(b[i]-b[j])/(1.0*(b[j])*(a[j]-a[i])));
			}
			if(minn>maxx) {
				ok=0;
				break;
			}
		}
		if(ok) ans[i]=1;
	}
	for(ll i=1;i<=n;i++){
		if(ans[i]){
			printf("%lld ",i);
		}
	}
	puts("");
}


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,st[310000],to[310000],v[310000];
struct node{
	double a,b;
	int id;
}w[310000];
char cmp1(node x,node y){
	return (x.a>y.a)||(x.a==y.a&&x.b>y.b);
}
char cmp2(node x,node y){
	return (x.b>y.b)||(x.b==y.b&&x.a>y.a);
}
char cmp3(node x,node y){
	return (x.a>y.a)||(x.a==y.a&&x.b>y.b);
}
double cal(int x,int y){
	return w[x].a/w[x].b*w[y].a/w[y].b*(w[x].b-w[y].b)/(w[x].a-w[y].a);
}
int main(){
	//freopen("slay4.in","r",stdin);
	scanf("%d",&n);
	for(register int i=1;i<=n;i++) scanf("%lf%lf",&w[i].a,&w[i].b),w[i].id=i;
	sort(w+1,w+n+1,cmp1);
	double maxn=0;
	for(register int i=1;i<=n;i++){
		if(w[i].b<maxn) v[w[i].id]=1;
		maxn=max(maxn,w[i].b);
	}
	sort(w+1,w+n+1,cmp2);
	maxn=0;
	for(register int i=1;i<=n;i++){
		if(w[i].a<maxn) v[w[i].id]=1;
		maxn=max(maxn,w[i].a);
	}
	int num=0;
	for(register int i=1;i<=n;i++){
		if(!v[w[i].id]){
			++num;
			w[num].a=w[i].a,w[num].b=w[i].b;
			w[num].id=w[i].id;
		}
	}
	n=num;
	sort(w+1,w+n+1,cmp3);
	num=0;
	for(register int i=1;i<=n;i++){
		if(w[i].a==w[i-1].a&&w[i].b==w[i-1].b){
			to[w[i-1].id]=w[i].id;
		}
		else{
			w[++num].a=w[i].a,w[num].b=w[i].b;
			w[num].id=w[i].id;
		}
	}
	n=num;
	sort(w+1,w+n+1,cmp3);
	st[++st[0]]=1;
	for(register int i=2;i<=n;i++){
		if(cal(st[st[0]],i)>0) continue;
 		while(st[0]>1&&cal(st[st[0]-1],st[st[0]])-cal(st[st[0]],i)>1e-10) st[0]--;
		st[++st[0]]=i;
	}
	num=st[0];
	for(register int i=1;i<=st[0];i++){
		st[i]=w[st[i]].id;
		for(register int j=to[st[i]];j;j=to[j])
			st[++num]=j;
	}
	st[0]=num;
	sort(st+1,st+st[0]+1);
	for(register int i=1;i<=st[0];i++) printf("%d ",st[i]);
}


#include<bits/stdc++.h>
using namespace std;
struct rec{int a,b,id;}e[300001];
int n;
bool vis[300001],ans[300001];
int sta[300001];
bool cmp(rec a,rec b){return a.a>b.a||(a.a==b.a&&a.b>b.b);}
double slope(rec a,rec b){return 1.0*a.a*b.a*(a.b-b.b)/(a.b*b.b*(a.a-b.a));}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&e[i].a,&e[i].b);
		e[i].id=i;
	}
	sort(e+1,e+n+1,cmp);
	int maxb=e[1].b;
	for(int i=2;i<=n;i++)
		if(e[i].b<=maxb)vis[i]=1;
		else maxb=e[i].b;
	sta[++sta[0]]=1;
	for(int i=2;i<=n;i++)
	{
		if(vis[i])continue;
		if(slope(e[i],e[sta[sta[0]]])>0)continue;
		while(sta[0]>0&&slope(e[i],e[sta[sta[0]]])<slope(e[sta[sta[0]-1]],e[sta[sta[0]]]))sta[0]--;
		sta[++sta[0]]=i;
	}
	for(int i=1;i<=sta[0];i++)
	{
		ans[e[sta[i]].id]=1;
		for(int j=sta[i]+1;j<=n&&e[sta[i]].a==e[j].a&&e[sta[i]].b==e[j].b;j++)ans[e[j].id]=1;
	}
	for(int i=1;i<=n;i++)if(ans[i])printf("%d ",i);
	return 0;
}


#include<bits/stdc++.h>

using namespace std;

int n,maxx,maxy;

struct Piont
{
	int x,y,id;
}p[3000001];

int last[3000001],q[3000001],t;

double k[3000001];

bool cmp (Piont a,Piont b)
{

	return (a.x>b.x)||(a.x==b.x&&a.y>b.y);
}
bool ok[3000001];
inline double askline(Piont a,Piont b)
{

	return (double)a.x*b.x*(b.y-a.y)/((double)a.y*b.y*(b.x-a.x));
}
int main(){

	cin>>n;

	for(int i=1;i<=n;i++)

	{

		cin>>p[i].x>>p[i].y,p[i].id=i;

		if(maxy<p[i].y||(maxy==p[i].y&&maxx<p[i].x))

			maxx=p[i].x,maxy=p[i].y;

	}

	sort(p+1,p+n+1,cmp);

	q[t=1]=1;

	for(int i=2;i<=n&&maxx<=p[i].x;i++)

	{

		if(p[i].x==p[q[t]].x)

		{

			if(p[i].y==p[q[t]].y)

				last[p[i].id]=last[p[q[t]].id],last[p[q[t]].id]=p[i].id;

			continue;

		}

		while(t>1&&k[t]>askline(p[q[t]],p[i]))

			t--;

		q[++t]=i;

		k[t]=askline(p[q[t-1]],p[i]);

	}

	for(;t;--t)

		for(int i=p[q[t]].id;i;i=last[i]) ok[i]=1;

	for(int i=1;i<=n;i++)

		if(ok[i]) cout<<i<<' ';

}


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return x*f;
}
const int N=3e5+5;
int n,del[N];
int st[N],top,ok[N];
struct node
{
    double l,r;
    int id;
}s[N];
bool cmp (const node &a,const node &b)
{
    return a.l==b.l?a.r>b.r:a.l>b.l;
}
double cacl(node a,node b)
{
    return a.l*b.l*(b.r-a.r)/((b.l-a.l)*a.r*b.r);
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        s[i].l=read();s[i].r=read();
        s[i].id=i;
    }
    sort(s+1,s+n+1,cmp);
    double maxn=-1e9;
    for(int i=1;i<=n;i++)
    {
        if(s[i].r<=maxn)del[i]=1;
        else maxn=s[i].r;
    }
    st[++top]=1;
    for(int i=2;i<=n;i++)
    {
        if(del[i])continue;
        while(top>1&&cacl(s[i],s[st[top]])<cacl(s[st[top-1]],s[st[top]]))
            top--;
        st[++top]=i;
    }
    for(int i=1;i<=top;i++)
    {
        ok[s[st[i]].id]=1;
        int p=st[i]+1;
        while(p<=n&&s[p].l==s[st[i]].l&&s[p].r==s[st[i]].r)
            ok[s[p].id]=1,p++;
    }
    for(int i=1;i<=n;i++)
        if(ok[i])printf("%d ",i);
    putchar('\n');
    return 0;
}


#include<bits/stdc++.h>
#define R register int
#define ll long long
#define db long double
using namespace std;
const int N=500001;
int n,tot,len,tp,ans[N];
vector<int>G[N];
struct Qs{int u,v,id;}w[N];
struct nod{db k,b,id;}Q[N],STK[N];
int cmp(const Qs &x,const Qs &y){
	if(x.u==y.u)return x.v>y.v;
	return x.u<y.u;
}
int gi(){
    R x=0,k=1;char c=getchar();
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')k=-1,c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*k;
}
db sol(nod x,nod y){
	return (y.b-x.b)/(x.k-y.k);
}

int main(){
	n=gi();
	for(R i=1;i<=n;++i)w[i]=(Qs){gi(),gi(),i};
	sort(w+1,w+n+1,cmp);
	for(R i=1,j=1;i<=n;i=j=j+1){
		while(j<n&&w[j+1].u==w[i].u)++j;
		Q[++tot]=(nod){1.0/w[i].u,1.0/w[i].v,tot};
		for(R k=i;k<=j&&w[k].v==w[i].v;++k)G[tot].push_back(w[k].id);
	}
	for(R i=1;i<=tot;++i){
		while(tp>1&&sol(STK[tp],STK[tp-1])>sol(Q[i],STK[tp-1]))--tp;
		STK[++tp]=Q[i];
	}
	for (R i=1;i<=tp;++i)
		if (i==tp||sol(STK[i],STK[i+1])>0){
			R x=STK[i].id;
			for(R i=0,sz=G[x].size();i<sz;++i)
				ans[++len]=G[x][i];
		}
	sort(ans+1,ans+len+1);
	for(R i=1;i<=len;++i)printf("%d ",ans[i]);
	return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,st[110000],to[110000];
struct node{
	double a,b;
	int id;
	bool operator < (const node x)const{
		return (a<x.a)||(a==x.a&&b<x.b);
	}
}w[110000];
double cal(int x,int y){
	if(w[y].a==w[x].a) return 0x7fffffff;
	if(w[y].b==w[x].b) return 0x7fffffff;
	return (w[y].b-w[x].b)/(w[y].a-w[x].a);
}
int main(){
	//freopen("slay4.in","r",stdin);
	scanf("%d",&n);
	for(register int i=1;i<=n;i++) scanf("%lf%lf",&w[i].a,&w[i].b),w[i].a=10000000.0/w[i].a,w[i].b=10000000.0/w[i].b,w[i].id=i;
	sort(w+1,w+n+1);
	int num=0;
	for(register int i=1;i<=n;i++){
		if(w[i].a==w[i-1].a&&w[i].b==w[i-1].b){
			to[w[i-1].id]=w[i].id;
		}
		else{
			w[++num].a=w[i].a,w[num].b=w[i].b;
			w[num].id=w[i].id;
		}
	}
	n=num;
	sort(w+1,w+n+1);
	st[++st[0]]=1;
	for(register int i=2;i<=n;i++){
		if(cal(st[st[0]],i)>0) continue;
 		while(st[0]>1&&cal(st[st[0]-1],st[st[0]])-cal(st[st[0]],i)>1e-10) st[0]--;
		st[++st[0]]=i;
	}
	num=st[0];
	for(register int i=1;i<=st[0];i++){
		st[i]=w[st[i]].id;
		for(register int j=to[st[i]];j;j=to[j])
			st[++num]=j;
	}
	st[0]=num;
	sort(st+1,st+st[0]+1);
	for(register int i=1;i<=st[0];i++) printf("%d ",st[i]);
}


#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#define dd double
#define maxn 300300
#define ll long long
#define inf 9000000000000000000
using namespace std;
struct node{
	int a,b,id;
	dd x,y;
}q[maxn],s[maxn],qc[maxn];
int n,top,js;
bool pd[maxn];
vector <int> son[maxn];
bool cmp(const node &a,const node &b)//斜率单调增
{
	return a.x==b.x?a.y<b.y:a.x<b.x;
}
dd get(node a,node b)//a.x<b.x
{
	return (a.y-b.y)/(a.x-b.x);
}
int main()
{
//	freopen("slay4.in","r",stdin);
//	freopen("1.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d%d",&q[i].a,&q[i].b);
		q[i].id=i;
		q[i].x=(dd)1000.00000/(dd)q[i].a;
		q[i].y=(dd)1000.00000/(dd)q[i].b;
	}
	sort(q+1,q+n+1,cmp);
	int id=q[1].id,stda=q[1].a,stdb=q[1].b;  qc[++js]=q[1];
	for(int i=2;i<=n;++i)
	{
		if(q[i].a!=stda||q[i].b!=stdb)
		{
			qc[++js]=q[i];
			id=q[i].id;  stda=q[i].a;  stdb=q[i].b;
		}
		else  son[id].push_back(q[i].id);
	}
	s[++top]=qc[1];
	for(int i=2;i<=js;++i)
	{
		if(qc[i].y>=s[top].y)  cs++;
		while(top!=1&&get(s[top],qc[i])<get(s[top-1],s[top]))  top--;
		s[++top]=qc[i];
	}
	for(int i=1;i<=top;++i)
	{
		int num=s[i].id;  pd[num]=1;
		for(int j=0;j<son[num].size();++j)  pd[son[num][j]]=1;
	}
	for(int i=1;i<=n;++i)
		if(pd[i])  printf("%d ",i);
	puts("");
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 555555
struct whs{
	double x,y;
	ll id;
	friend bool operator < (const whs &a,const whs &b){
		return a.x==b.x?a.y<b.y:a.x<b.x;
	}
}node[A],p[A];
vector <ll> id[A];
vector <ll> ans;
ll n,m=1,top;
ll sta[A];
double cal(ll a,ll b){
//	printf("a=%lld b=%lld %lf\n",a,b,((p[a].y-p[b].y)/(p[a].x-p[b].x)));
	return ((p[a].y-p[b].y)/((p[a].x-p[b].x)));
}
int main(){
//	freopen("slay3.in","r",stdin);
//	freopen("zj.out","w",stdout);
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++){
		scanf("%lf%lf",&node[i].x,&node[i].y);
		node[i].x=1/node[i].x;
		node[i].y=1/node[i].y;
		node[i].id=i;
	}
	sort(node+1,node+n+1);
	p[1]=node[1];
	m=1;
	for(ll i=2;i<=n;++i){
		if(fabs(node[i].x-node[i-1].x)>1e-9)
			p[++m]=node[i];
		else if(fabs(node[i].y-p[m].y)<=1e-9)
			id[p[m].id].push_back(node[i].id);
	}
//	for(ll i=1;i<=n;i++){
//		printf("i=%lld p[%lld ",i,p[i].id);
//		for(ll j=0;j<id[i].size();j++){
//			printf("p[%lld ",id[i][j]);
//		}
//		printf("\n");
//	}
	sta[1]=1,sta[2]=2;top=2;
	for(ll i=3;i<=m;i++){
		while(top>1&&cal(sta[top-1],sta[top])>cal(sta[top-1],i))
			top--;
		sta[++top]=i;
//		printf("i=%lld top=%lld\n",i,top);
	}
//	printf("top=%lld\n",top);
	ans.push_back(p[sta[1]].id);
	for(ll j=0;j<id[p[sta[1]].id].size();j++)
		ans.push_back(id[p[sta[1]].id][j]);
//	for(ll j=0;j<ans.size();j++){
//		printf("***************%lld \n",ans[j]);
//	}
	//printf("***id[%lld][%lld]=%lld\n",p[sta[1]].id,j,id[p[sta[1]].id][j]);
	for(ll i=2;i<=top;i++){
//		printf("sta[%lld]=%lld\n",i,sta[i]);
		if(cal(sta[i-1],sta[i])<0){
			ans.push_back(p[sta[i]].id);
//			printf("p[%lld].id=%lld\n",sta[i],p[sta[i]].id);
			for(ll j=0;j<id[p[sta[i]].id].size();j++){
				ans.push_back(id[p[sta[i]].id][j]);
//			printf("%lld\n",id[p[sta[i]].id][j]);
			}
		}
		else break;
	}
	sort(ans.begin(),ans.end());
//	printf("ans.size()=%lld\n",ans.size()*1ll);
	for(ll i=0;i<ans.size();i++){
		printf("%lld ",ans[i]);
	}
	printf("\n");
}


#include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <math.h>
#include <time.h>
#include <bitset>
#include <stdio.h>
#include <numeric>
#include <string.h>
#include <iostream>
#include <algorithm>
#define Fi first
#define Se second
#define ll long long
using namespace std;

int in(int &x,int &y,int &z){return scanf("%d%d%d",&x,&y,&z);}int in(ll &x,ll &y,ll &z){return scanf("%lld%lld%lld",&x,&y,&z);}int in(double &x,double &y,double &z){return scanf("%lf%lf%lf",&x,&y,&z);}int in(int &x,ll &y){return scanf("%d%lld",&x,&y);}int in(ll &x,int &y){return scanf("%lld%d",&x,&y);}int in(int &x,int &y){return scanf("%d%d",&x,&y);}int in(ll &x,ll &y){return scanf("%lld%lld",&x,&y);}int in(char a[],char b[]){return scanf("%s%s",a,b);}int in(double &x,double &y){return scanf("%lf%lf",&x,&y);}int in(char &c){return scanf("%c",&c);}int in(char s[]){return scanf("%s",s);}int in(int &x){return scanf("%d",&x);}int in(ll &x){return scanf("%lld",&x);}int in(double &x){return scanf("%lf",&x);}int in(pair<int,int> &p){return scanf("%d%d",&p.Fi,&p.Se);}int in(pair<ll,ll>&p){return scanf("%lld%lld",&p.Fi,&p.Se);}int in(pair<double,double> &p){return scanf("%lf%lf",&p.Fi,&p.Se);}int in(long double &a){return scanf("%Lf",&a);}int in(int &x,int &y,int &z,int &k){return scanf("%d%d%d%d",&x,&y,&z,&k);}

#define inf 0x3f3f3f3f
#define PN printf("\n")
#define lowbit(x) (x&-x)
#define ull unsigned long long
#define mmin(x,y,z) min(x,min(y,z))
#define mmax(x,y,z) max(x,max(y,z))
#define PP(x) cout<<#x<<"="<<x<<" "
#define debug(x) PP(x),PN;
#define debug2(x,y) PP(x),PP(y),PN;
#define debug3(x,y,z) PP(x),PP(y),PP(z),PN;
#define debug4(x,y,z,k) PP(x),PP(y),PP(z),PP(k),PN;
#define RunTime printf("The run time is:%.3fs\n",(double)clock()/CLOCKS_PER_SEC);
const int N=2e6+10;
const int M=1e3+10;
const int mod=998244353;
ull Hash1[N<<1][2],Hash2[N<<1][2],bin[N<<1][2],seed=13131;//因为是自然溢出所以没必要取模
//seed  131 13131 13331
//另外hash是保留字符只能首字母大写了....
void get_hash(int n,char s[],ull hash[][2])
{
    bin[0][0]=bin[0][1]=1;
    for(int i=1;i<=n;i++) hash[i][0] = hash[i - 1][0]*13331+s[i],bin[i][0]=bin[i-1][0]*13131;
    for(int i=1;i<=n;i++) hash[i][1] = hash[i - 1][1]*131+s[i],bin[i][1]=bin[i-1][1]*131;
    //hash[i - 1]*seed+s[i]-'a' -'a'没有必要都是aaa反而会被卡 所以s[i]不能等于0
}
inline pair<ull,ull> get_sub(int l,int r,ull hash[][2])
{
	if(l>r) return {0,0};
    return {hash[r][0] - hash[l - 1][0] * bin[r - l + 1][0],
        hash[r][1] - hash[l - 1][1] * bin[r - l + 1][1]};
}

int mac[N<<1];
char Ans[N<<1];

int get_mac(int n,char s[])
{
    int ans=1;
    for(int i=1,p=1,j=0;i<=n;i++)
    {
        if(i+mac[(j<<1)-i]>=p)
        {
            while(p<=n&&s[p]==s[(i<<1)-p])
            {
                p++;//p++才会产生本质不同回文串
            }
            j=i;mac[i]=p-i;
        }
        else mac[i]=mac[(j<<1)-i];
        ans=max(ans,mac[i]-1);
    }
    return ans;
}
char s[N],new_s[N<<1];
int main()
{
	int T;in(T);
	while(T--)
	{
		scanf("%s",s+1);
	    int n=strlen(s+1),cnt=0;
	    new_s[cnt]='~';
	    for(int i=1;i<=n;i++)
	    {
	        new_s[++cnt]='#';new_s[++cnt]=s[i];
	    }
	    new_s[++cnt]='#';new_s[cnt+1]=0;

		reverse(new_s+1,new_s+cnt+1);
		get_hash(cnt,new_s,Hash1);
		reverse(new_s+1,new_s+cnt+1);
		get_hash(cnt,new_s,Hash2);

		get_mac(cnt,new_s);
		int mx=0,ans=-1,a1,a2;
		for(int i=1;i<=cnt;i++)
		{
			int l=i-mac[i],r=cnt-(i+mac[i]-1);
			if(get_sub(1,l,Hash1)==get_sub(1,l,Hash2)&&l<=r)
			{
				if(mx<l+mac[i]){
					mx=mac[i]+l;
					ans=i;
					a1=i+mac[i]-1;a2=cnt-l;
				}
			}
			if(get_sub(1,r,Hash1)==get_sub(1,r,Hash2)&&r<=l)
			{
				if(mx<r+mac[i]){
					mx=mac[i]+r;
					ans=i;
					a1=r;a2=i-mac[i]+1;
				}
			}
		}
        int t=0;
		for(int i=1;i<=a1;i++)
		{
			if(new_s[i]!='#') Ans[++t]=new_s[i];
		}
		for(int i=a2;i<=cnt;i++)
		{
			if(new_s[i]!='#') Ans[++t]=new_s[i];
		}
		// printf("\n");
        if(mx-1!=t) debug2(mx,t)
        Ans[t+1]=0;
        printf("%s\n",Ans+1);
	}

    return 0;
}
/*
$a$c$b$b$a$
$a$b$b$c$a$

a+回文+b
*/