import java.io.*;
import java.util.*;

public class points_pk {

	BufferedReader br;
	PrintWriter out;
	StringTokenizer st;

	public String nextToken() throws IOException {
		while ((st == null) || (!st.hasMoreTokens()))
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}

	public double nextDouble() throws IOException {
		return Double.parseDouble(nextToken());
	}

	public long nextLong() throws IOException {
		return Long.parseLong(nextToken());
	}

	class point {
		long x, y, num;

		public point(long c, long d, int num) {
			super();
			this.x = c;
			this.y = d;
			this.num = num;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + getOuterType().hashCode();
			result = prime * result + (int) (x ^ (x >>> 32));
			result = prime * result + (int) (y ^ (y >>> 32));
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			point other = (point) obj;
			if (!getOuterType().equals(other.getOuterType()))
				return false;
			if (x != other.x)
				return false;
			if (y != other.y)
				return false;
			return true;
		}

		private points_pk getOuterType() {
			return points_pk.this;
		}

	}

	public void solve() throws IOException {
		int n = nextInt();
		HashMap<point, Integer> available = new HashMap<points_pk.point, Integer>();
		ArrayList<point> res = new ArrayList<points_pk.point>();

		for (int i = 0; i < n; i++) {
			point t = new point(nextInt(), nextInt(), i);
			if (t.x == 0 || t.y == 1)
				res.add(t);
			else
				available.put(t, i);
		}
		
		for (int i = 0;i < res.size(); i++) {
			point a = res.get(i);
			for (int j = 0; j < i; j++) {
				point b = res.get(j);
				long c = a.x * b.y + a.y * b.x;
				long d = a.y * b.y;
				d *= 2;
				long gcd = gcd(c, d);
				c /= gcd;
				d /= gcd;
				if (!available.containsKey(new point(c, d, -1)))
					continue;
				res.add(new point(c, d, available.get(new point(c, d, -1))));
				available.remove(new point(c, d, -1));
			}
		}

		if (available.isEmpty()) {
			out.println("YES");
			for (point d : res) {
				out.print(d.num + 1 + " ");
			}
			out.println();
		} else {
			out.println("NO");
			for (point t : available.keySet()) {
				out.print(t.num + 1);
				break;
			}
			out.println();
		}
	}

	private long gcd(long c, long d) {
		while (c * d != 0) {
			if (c > d)
				c %= d;
			else
				d %= c;
		}
		return c + d;
	}

	public void run() {
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			out = new PrintWriter(System.out);

			br = new BufferedReader(new FileReader("points.in"));
			out = new PrintWriter("points.out");

			solve();

			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new points_pk().run();
	}
}