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 
5
10 50
10 50
10 50
10 50
10 50
 2
10000 10000
10000 10000
 3
10000 10000
10000 10000
10000 10000
 3
1000 3000
1500 1500
3000 1000
 43
75 16
70 7
75 16
54 2
70 7
54 2
70 7
54 2
70 7
54 2
54 2
70 7
70 7
54 2
70 7
75 16
70 7
54 2
54 2
54 2
54 2
54 2
54 2
75 16
70 7
70 7
54 2
70 7
75 16
54 2
75 16
75 16
54 2
54 2
70 7
70 7
75 16
70 7
70 7
70 7
75 16
75 16
54 2
 1
1 1
 2
1 1
1 1
 44
78 52
75 16
70 7
75 16
54 2
70 7
54 2
70 7
54 2
70 7
54 2
54 2
70 7
70 7
54 2
70 7
75 16
70 7
54 2
54 2
54 2
54 2
54 2
54 2
75 16
70 7
70 7
54 2
70 7
75 16
54 2
75 16
75 16
54 2
54 2
70 7
70 7
75 16
70 7
70 7
70 7
75 16
75 16
54 2
 3
1000 3000
1499 1499
3000 1000
 5
50 50
49 50
50 49
49 49
50 1
 18
82 38
33 69
33 69
33 69
33 69
33 69
82 38
33 69
33 69
33 69
82 38
33 69
33 69
82 38
82 38
33 69
33 69
33 69
 1
10000 9999
 3
1000 3000
1501 1501
3000 1000
 2
1 2
2 1

1 2 3 4 5
 1 2
 1 2 3
 1 2 3
 1 3 16 24 29 31 32 37 41 42
 1
 1 2
 1
 1 3
 1
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 1
 1 2 3
 1 2 

import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.io.IOException;
import java.util.TreeSet;
import java.io.UncheckedIOException;
import java.io.Closeable;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.io.InputStream;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 */
public class Main {
    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(null, new TaskAdapter(), "", 1 << 29);
        thread.start();
        thread.join();
    }

    static class TaskAdapter implements Runnable {
        @Override
        public void run() {
            InputStream inputStream = System.in;
            OutputStream outputStream = System.out;
            FastInput in = new FastInput(inputStream);
            FastOutput out = new FastOutput(outputStream);
            CTavasAndPashmaks solver = new CTavasAndPashmaks();
            solver.solve(1, in, out);
            out.close();
        }
    }

    static class CTavasAndPashmaks {
        double prec = 1e-8;

        public boolean equal(ConvexHullTrick.Line a, ConvexHullTrick.Line b) {
            return Math.abs(a.a - b.a) <= prec && Math.abs(a.b - b.b) <= prec;
        }

        public void solve(int testNumber, FastInput in, FastOutput out) {
            int n = in.ri();
            double[][] speeds = new double[n][2];
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < 2; j++) {
                    speeds[i][j] = 1d / in.ri();
                }
            }
            ConvexHullTrick cht = new ConvexHullTrick();
            ConvexHullTrick.Line[] lines = new ConvexHullTrick.Line[n];
            double range = 1e4;
            for (int i = 0; i < n; i++) {
                lines[i] = cht.insert(-(speeds[i][0] - speeds[i][1]), -speeds[i][1] * range);
            }
            for (int i = 0; i < n; i++) {
                ConvexHullTrick.Line left = cht.floorLine(lines[i].a);
                ConvexHullTrick.Line right = cht.ceilLine(lines[i].a);
                boolean ok = false;
                if (equal(left, lines[i])) {
                    if (left.r > 0 && left.l < range) {
                        ok = true;
                    }
                } else if (equal(right, lines[i])) {
                    if (right.r > 0 && right.l < range) {
                        ok = true;
                    }
                } else {
                    double intersect = left.r;
                    if (Math.abs(left.y(intersect) - lines[i].y(intersect)) <= prec && intersect > 0 && intersect < range) {
                        ok = true;
                    }
                }
                if (ok) {
                    out.append(i + 1).append(' ');
                }
            }
        }

    }

    static class ConvexHullTrick implements Iterable<ConvexHullTrick.Line> {
        static final double INF = 1e50;
        private TreeSet<ConvexHullTrick.Line> setSortedByA = new TreeSet<>(ConvexHullTrick.Line.orderByA);
        private TreeSet<ConvexHullTrick.Line> setSortedByL = new TreeSet<>(ConvexHullTrick.Line.orderByLx);
        private ConvexHullTrick.Line qBody = new ConvexHullTrick.Line(0, 0);

        public ConvexHullTrick.Line floorLine(double a) {
            qBody.a = a;
            return setSortedByA.floor(qBody);
        }

        public ConvexHullTrick.Line ceilLine(double a) {
            qBody.a = a;
            return setSortedByA.ceiling(qBody);
        }

        private double intersect(ConvexHullTrick.Line x, ConvexHullTrick.Line y) {
            return (x.b - y.b) / (y.a - x.a);
        }

        private void removeLine(ConvexHullTrick.Line line) {
            setSortedByA.remove(line);
            setSortedByL.remove(line);
        }

        private void addLine(ConvexHullTrick.Line line) {
            setSortedByA.add(line);
            setSortedByL.add(line);
        }

        public ConvexHullTrick.Line insert(double a, double b) {
            ConvexHullTrick.Line line = new ConvexHullTrick.Line(a, b);

            while (true) {
                ConvexHullTrick.Line floor = setSortedByA.floor(line);
                if (floor == null) {
                    line.l = -INF;
                    break;
                }
                if (floor.a == line.a) {
                    if (floor.b >= line.b) {
                        return line;
                    } else {
                        removeLine(floor);
                        continue;
                    }
                }

                double r = intersect(floor, line);
                if (r <= floor.l) {
                    removeLine(floor);
                    continue;
                }

                floor.r = Math.min(floor.r, r);
                line.l = r;
                break;
            }

            while (true) {
                ConvexHullTrick.Line ceil = setSortedByA.ceiling(line);
                if (ceil == null) {
                    line.r = INF;
                    break;
                }
                double r = intersect(line, ceil);
                if (r >= ceil.r) {
                    removeLine(ceil);
                    continue;
                }
                ceil.l = Math.max(ceil.l, r);
                line.r = r;
                break;
            }

            if (!line.isEmpty()) {
                addLine(line);
            }
            return line;
        }

        public Iterator<ConvexHullTrick.Line> iterator() {
            return setSortedByA.iterator();
        }

        public String toString() {
            StringBuilder builder = new StringBuilder();
            for (ConvexHullTrick.Line line : this) {
                builder.append(line).append('\n');
            }
            return builder.toString();
        }

        public static class Line {
            public double a;
            public double b;
            public double l;
            public double r;
            static Comparator<ConvexHullTrick.Line> orderByA = new Comparator<ConvexHullTrick.Line>() {

                public int compare(ConvexHullTrick.Line o1, ConvexHullTrick.Line o2) {
                    return Double.compare(o1.a, o2.a);
                }
            };
            static Comparator<ConvexHullTrick.Line> orderByLx = new Comparator<ConvexHullTrick.Line>() {

                public int compare(ConvexHullTrick.Line o1, ConvexHullTrick.Line o2) {
                    return Double.compare(o1.l, o2.l);
                }
            };

            public Line(double a, double b) {
                this.a = a;
                this.b = b;
            }

            public double y(double x) {
                return a * x + b;
            }

            public int hashCode() {
                return (int) (Double.doubleToLongBits(a) * 31 + Double.doubleToLongBits(b));
            }

            public boolean equals(Object obj) {
                ConvexHullTrick.Line line = (ConvexHullTrick.Line) obj;
                return a == line.a && b == line.b;
            }

            public String toString() {
                return a + "x+" + b;
            }

            public boolean isEmpty() {
                return r <= l;
            }

        }

    }

    static class FastOutput implements AutoCloseable, Closeable, Appendable {
        private static final int THRESHOLD = 1 << 13;
        private final Writer os;
        private StringBuilder cache = new StringBuilder(THRESHOLD * 2);

        public FastOutput append(CharSequence csq) {
            cache.append(csq);
            return this;
        }

        public FastOutput append(CharSequence csq, int start, int end) {
            cache.append(csq, start, end);
            return this;
        }

        private void afterWrite() {
            if (cache.length() < THRESHOLD) {
                return;
            }
            flush();
        }

        public FastOutput(Writer os) {
            this.os = os;
        }

        public FastOutput(OutputStream os) {
            this(new OutputStreamWriter(os));
        }

        public FastOutput append(char c) {
            cache.append(c);
            afterWrite();
            return this;
        }

        public FastOutput append(int c) {
            cache.append(c);
            afterWrite();
            return this;
        }

        public FastOutput flush() {
            try {
                os.append(cache);
                os.flush();
                cache.setLength(0);
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
            return this;
        }

        public void close() {
            flush();
            try {
                os.close();
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }

        public String toString() {
            return cache.toString();
        }

    }

    static class FastInput {
        private final InputStream is;
        private byte[] buf = new byte[1 << 13];
        private int bufLen;
        private int bufOffset;
        private int next;

        public FastInput(InputStream is) {
            this.is = is;
        }

        private int read() {
            while (bufLen == bufOffset) {
                bufOffset = 0;
                try {
                    bufLen = is.read(buf);
                } catch (IOException e) {
                    bufLen = -1;
                }
                if (bufLen == -1) {
                    return -1;
                }
            }
            return buf[bufOffset++];
        }

        public void skipBlank() {
            while (next >= 0 && next <= 32) {
                next = read();
            }
        }

        public int ri() {
            return readInt();
        }

        public int readInt() {
            int sign = 1;

            skipBlank();
            if (next == '+' || next == '-') {
                sign = next == '+' ? 1 : -1;
                next = read();
            }

            int val = 0;
            if (sign == 1) {
                while (next >= '0' && next <= '9') {
                    val = val * 10 + next - '0';
                    next = read();
                }
            } else {
                while (next >= '0' && next <= '9') {
                    val = val * 10 - next + '0';
                    next = read();
                }
            }

            return val;
        }

    }
}

