Tavas is a cheerleader in the new sports competition named "Pashmaks".

<image>

This competition consists of two part: swimming and then running. People will immediately start running R meters after they finished swimming exactly S meters. A winner is a such person that nobody else finishes running before him/her (there may be more than one winner).

Before the match starts, Tavas knows that there are n competitors registered for the match. Also, he knows that i-th person's swimming speed is si meters per second and his/her running speed is ri meters per second. Unfortunately, he doesn't know the values of R and S, but he knows that they are real numbers greater than 0.

As a cheerleader, Tavas wants to know who to cheer up. So, he wants to know all people that might win. We consider a competitor might win if and only if there are some values of R and S such that with these values, (s)he will be a winner.

Tavas isn't really familiar with programming, so he asked you to help him.

Input

The first line of input contains a single integer n (1 ≤ n ≤ 2 × 105).

The next n lines contain the details of competitors. i-th line contains two integers si and ri (1 ≤ si, ri ≤ 104).

Output

In the first and the only line of output, print a sequence of numbers of possible winners in increasing order.

Examples

Input

3
1 3
2 2
3 1


Output

1 2 3 


Input

3
1 2
1 1
2 1


Output

1 3 
import java.io.*;
import java.util.*;

public class CF535E {
	static class Competitor {
		int i, s, r;	// (x,y) = (1/s,1/r)
		boolean minimal = false;
		boolean hull = false;
		Competitor(int i, int s, int r) {
			this.i = i;
			this.s = s;
			this.r = r;
		}
	}
	static Comparator<Competitor> xyComp = new Comparator<Competitor>() {
		@Override public int compare(Competitor c1, Competitor c2) {
			// increasing (x,y) decreasing (s,r)
			return c2.s != c1.s ? c2.s - c1.s : c2.r - c1.r;
		}
	};
	static Comparator<Competitor> iComp = new Comparator<Competitor>() {
		@Override public int compare(Competitor c1, Competitor c2) {
			return c1.i - c2.i;	// increasing i
		}
	};
	static long area2(Competitor c1, Competitor c2, Competitor c3) {
		// cross product (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)
		// (1/s2 - 1/s1) * (1/r3 - 1/r1) - (1/s3 - 1/s1) * (1/r2 - 1/r1)
		// multiple by s1 * s2 * s3 * r1 * r2 * r3
		// s3 * (s1 - s2) * r2 * (r1 - r3) - s2 * (s1 - s3) * r3 * (r1 - r2)
		return (long) c3.s * (c1.s - c2.s) * c2.r * (c1.r - c3.r)
			- (long) c2.s * (c1.s - c3.s) * c3.r * (c1.r - c2.r);
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(System.out);
		int n = Integer.parseInt(br.readLine());
		Competitor[] cc = new Competitor[n];
		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int s = Integer.parseInt(st.nextToken());
			int r = Integer.parseInt(st.nextToken());
			cc[i] = new Competitor(i + 1, s, r);
		}
		Arrays.sort(cc, xyComp);
		cc[0].minimal = true;
		for (int i = 0, j = 1; j < n; j++)
			if (cc[j].s < cc[i].s && cc[j].r > cc[i].r) {	// x_j > x_i && y_j < y_i
				cc[j].minimal = true;
				i = j;
			}
		Competitor[] stack = new Competitor[n];
		int top = 0;
		for (int i = 0; i < n; i++) {	// convex hull of distinct minimal points
			Competitor c = cc[i];
			if (!c.minimal)
				continue;
			while (true) {
				if (top < 2)
					break;
				Competitor a = stack[top - 2];
				Competitor b = stack[top - 1];
				if (area2(a, b, c) >= 0)
					break;
				top--;
			}
			stack[top++] = c;
		}
		for (int j = 0; j < top; j++)
			stack[j].hull = true;
		for (int i = 1; i < n; i++)
			if (cc[i - 1].hull && cc[i - 1].s == cc[i].s && cc[i - 1].r == cc[i].r)
				cc[i].hull = true;
		Arrays.sort(cc, iComp);
		for (int i = 0; i < n; i++)
			if (cc[i].hull)
				pw.print(cc[i].i + " ");
		pw.println();
		pw.close();
	}
}
