You are given n points on Cartesian plane. Every point is a lattice point (i. e. both of its coordinates are integers), and all points are distinct.

You may draw two straight lines (not necessarily distinct). Is it possible to do this in such a way that every point lies on at least one of these lines?

Input

The first line contains one integer n (1 ≤ n ≤ 105) — the number of points you are given.

Then n lines follow, each line containing two integers xi and yi (|xi|, |yi| ≤ 109)— coordinates of i-th point. All n points are distinct.

Output

If it is possible to draw two straight lines in such a way that each of given points belongs to at least one of these lines, print YES. Otherwise, print NO.

Examples

Input

5
0 0
0 1
1 1
1 -1
2 2


Output

YES


Input

5
0 0
1 0
2 1
1 1
2 3


Output

NO

Note

In the first example it is possible to draw two lines, the one containing the points 1, 3 and 5, and another one containing two remaining points.

<image>
import java.util.*;
public class Task961D {
	public static void main(String[] args) { 
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		Pair[] points = new Pair[n];
		for(int i = 0; i < n; i++) 
			points[i] = new Pair(sc.nextLong(), sc.nextLong());
		System.out.print(ans(solve(points)));
		sc.close();
	}
	static String ans(boolean b) { 
		if(b) return "YES";
		return "NO";
	}
	
	static boolean solve(Pair[] points) { 
		int n = points.length;
		if(n < 5) return true;
		
		Pair one = points[0], two = points[1], three = null;
		
		boolean flag = true;
		
		for(int i = 2; i < n; i++) { 
			if(!coll(one, two, points[i])) { 
				//swap
				Pair x = points[i];
				points[i] = points[2];
				points[2] = x;
				three = points[2];
				flag = false;
				break;
			}
		}
		if(flag)
			return true;
		
		//We now have a triangle one, two, three
		Pair[] first = new Pair[2];
		Pair[] second = new Pair[2];
		//Case 1: one, two
		flag = true;
		first[0] = points[0];
		first[1] = points[1];
		second[0] = points[2];
		second[1] = null;
		
		for(int i = 3; i < n; i++) { 
			if(!coll(first[0], first[1], points[i])) {
				if(second[1] == null) { 
					second[1] = points[i];
				}
				else { 
					if(!coll(second[0], second[1], points[i])) {
						flag = false;
						break;
					}
				}
			}
		}
		if(flag)
			return true;
		
		//Case 2: two, three
		
		flag = true;
		first[0] = points[1];
		first[1] = points[2];
		second[0] = points[0];
		second[1] = null;
		
		for(int i = 3; i < n; i++) { 
			if(!coll(first[0], first[1], points[i])) {
				if(second[1] == null) { 
					second[1] = points[i];
				}
				else { 
					if(!coll(second[0], second[1], points[i])) {
						flag = false;
						break;
					}
				}
			}
		}
		
		if(flag)
			return true;
		
		//Case 3: three, one
		
		flag = true;
		first[0] = points[0];
		first[1] = points[2];
		second[0] = points[1];
		second[1] = null;
		
		for(int i = 3; i < n; i++) { 
			if(!coll(first[0], first[1], points[i])) {
				if(second[1] == null) { 
					second[1] = points[i];
				}
				else { 
					if(!coll(second[0], second[1], points[i])) {
						flag = false;
						break;
					}
				}
			}
		}
		
		return flag;
	}
	static boolean coll(Pair x, Pair y, Pair z) { 
		//  x1 y1 1
		//  x2 y2 1
		//  x3 y3 1
		
		
		// x1y2
		long x1 = x.x;
		long y1 = x.y;
		long x2 = y.x;
		long y2 = y.y;
		long x3 = z.x;
		long y3 = z.y;
		return (x1 * y2 + x2 * y3 + y1 * x3 - y2 * x3 - x1 * y3 - x2*y1 == 0L);
	}
	static class Pair { 
		public long x, y;
		public Pair(long x, long y) {
			this.x = x;
			this.y = y;
		}
		public String toString() { 
			return "(" + x + ", " + y + ")";
		}
		public boolean equals(Object o) { 
			if(o == null || o.getClass() != this.getClass())
				return false;
			Pair temp = (Pair) o;
			return temp.x == this.x && temp.y == this.y;
		}
	}
}
