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.util.Arrays;
import java.util.Deque;
import java.io.OutputStreamWriter;
import java.util.function.IntFunction;
import java.io.OutputStream;
import java.util.Collection;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;
import java.io.Closeable;
import java.io.Writer;
import java.util.Comparator;
import java.util.ArrayDeque;
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 {
        public void solve(int testNumber, FastInput in, FastOutput out) {
            int n = in.ri();
            Point2Ext[] pts = new Point2Ext[n];
            for (int i = 0; i < n; i++) {
                pts[i] = new Point2Ext(1d / in.ri(), 1d / in.ri());
            }
            Point2Ext[] convexHull = ConvexHull2.grahamScan(Arrays.asList(pts), true).toArray(new Point2Ext[0]);
            int leftest = CompareUtils.argmin(i -> convexHull[i], 0, convexHull.length - 1,
                    Comparator.<Point2Ext>comparingDouble(x -> x.x).thenComparingDouble(x -> x.y));
            int rightest = CompareUtils.argmin(i -> convexHull[i], 0, convexHull.length - 1,
                    Comparator.<Point2Ext>comparingDouble(x -> x.y).thenComparingDouble(x -> x.x));
            for (int i = leftest; ; i = (i + 1) % convexHull.length) {
                convexHull[i].ok = true;
                if (i == rightest) {
                    break;
                }
            }
            for (int i = 0; i < n; i++) {
                if (pts[i].ok) {
                    out.append(i + 1).append(' ');
                }
            }
        }

    }

    static class Point2 implements Cloneable {
        public static final Comparator<Point2> SORT_BY_XY = (a, b) ->
        {
            int ans = GeoConstant.compare(a.x, b.x);
            if (ans == 0) {
                ans = GeoConstant.compare(a.y, b.y);
            }
            return ans;
        };
        public final double x;
        public final double y;

        public static Comparator<Point2> sortByPolarAngleAround(Point2 center) {
            return (a, b) -> {
                int aHalf = half(a.x - center.x, a.y - center.y);
                int bHalf = half(b.x - center.x, b.y - center.y);
                if (aHalf != bHalf) {
                    return aHalf - bHalf;
                }
                return orient(center, b, a);
            };
        }

        public Point2(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public Point2() {
            this(0, 0);
        }

        private static int half(double x, double y) {
            return y > 0 || y == 0 && x < 0 ? 1 : 0;
        }

        public static double cross(Point2 a, Point2 b, Point2 c) {
            return GeoConstant.cross(b.x - a.x, b.y - a.y,
                    c.x - a.x, c.y - a.y);
        }

        public static int orient(Point2 a, Point2 b, Point2 c) {
            return GeoConstant.sign(GeoConstant.cross(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y));
        }

        public static double dist2(Point2 a, Point2 b) {
            double dx = a.x - b.x;
            double dy = a.y - b.y;
            return dx * dx + dy * dy;
        }

        public Point2 clone() {
            try {
                return (Point2) super.clone();
            } catch (CloneNotSupportedException e) {
                throw new RuntimeException(e);
            }
        }

        public String toString() {
            return String.format("(%.6f, %.6f)", x, y);
        }

        public int hashCode() {
            return Double.hashCode(x) * 31 + Double.hashCode(y);
        }

        public boolean equals(Object obj) {
            Point2 other = (Point2) obj;
            return x == other.x && y == other.y;
        }

    }

    static class SequenceUtils {
        public static <T> void swap(T[] data, int i, int j) {
            T tmp = data[i];
            data[i] = data[j];
            data[j] = tmp;
        }

        public static <T> void reverse(T[] data, int l, int r) {
            while (l < r) {
                swap(data, l, r);
                l++;
                r--;
            }
        }

    }

    static class Point2Ext extends Point2 {
        boolean ok;

        public Point2Ext(double x, double y) {
            super(x, y);
        }

    }

    static class GeoConstant {
        public static final double PREC = 1e-15;

        public static boolean isZero(double x) {
            return -PREC <= x && x <= PREC;
        }

        public static int sign(double x) {
            return isZero(x) ? 0 : x < 0 ? -1 : 1;
        }

        public static int compare(double a, double b) {
            return sign(a - b);
        }

        public static double cross(double x1, double y1, double x2, double y2) {
            return x1 * y2 - y1 * x2;
        }

    }

    static class CompareUtils {
        private CompareUtils() {
        }

        public static <T> int argmin(IntFunction<T> function, int l, int r, Comparator<T> comp) {
            int ans = l;
            T best = function.apply(l);
            for (int i = l + 1; i <= r; i++) {
                T cand = function.apply(i);
                if (comp.compare(cand, best) < 0) {
                    best = cand;
                    ans = i;
                }
            }
            return ans;
        }

    }

    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;
        }

    }

    static class ConvexHull2 {
        public static Collection<Point2> grahamScan(List<Point2> pointPolygon, boolean includeSameLine) {
            if (pointPolygon.size() <= 1) {
                return pointPolygon;
            }

            final Point2[] points = pointPolygon.toArray(new Point2[0]);
            int n = points.length;
            for (int i = 1; i < n; i++) {
                int cmp = Point2.SORT_BY_XY.compare(points[i], points[0]);
                if (cmp >= 0) {
                    continue;
                }
                SequenceUtils.swap(points, 0, i);
            }

            Point2 first = points[0];
            Comparator<Point2> cmpByPolarAngle = Point2.sortByPolarAngleAround(first);
            Arrays.sort(points, 1, n, cmpByPolarAngle.thenComparingDouble(x -> Point2.dist2(first, x)));

            if (!includeSameLine) {
                int shrinkSize = 2;
                for (int i = 2; i < n; i++) {
                    if (cmpByPolarAngle.compare(points[i], points[shrinkSize - 1]) == 0) {
                        points[shrinkSize - 1] = points[i];
                    } else {
                        points[shrinkSize++] = points[i];
                    }
                }
                n = shrinkSize;
            } else {
                int r = n - 1;
                int l = r;
                while (l - 1 > 0 && cmpByPolarAngle.compare(points[l], points[l - 1]) == 0) {
                    l--;
                }
                SequenceUtils.reverse(points, l, r);
            }

            Deque<Point2> stack = new ArrayDeque<>(n);
            stack.addLast(points[0]);
            for (int i = 1; i < n; i++) {
                while (stack.size() >= 2) {
                    Point2 last = stack.removeLast();
                    Point2 second = stack.peekLast();
                    int sign = GeoConstant.sign(Point2.cross(second, points[i], last));
                    if (sign < 0 || includeSameLine && sign == 0) {
                        stack.addLast(last);
                        break;
                    }
                }
                stack.addLast(points[i]);
            }

            return stack;
        }

    }
}

