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.io.*;
import java.util.*;

public class Solution{
	InputStream is;
	PrintWriter out;
	String INPUT = "";
	Scanner in=new Scanner(System.in);

	int n;
	long[][] point;
	public void solve(){
		n = ni();
		point = new long[n][2];
		for(int i = 0 ; i < n ; i++){
			point[i][0] = nl(); point[i][1] = nl();
		}

		if(n <= 4){
			out.println("YES");
			return;
		}

		//double s1 = slope(point[0][0], point[0][1], point[1][0], point[1][1]); 
		//double s2 = slope(point[0][0], point[0][1], point[2][0], point[2][1]); 
		//double s3 = slope(point[2][0], point[2][1], point[1][0], point[1][1]); 
		boolean ans = false;

		//for s1
		TreeSet<Integer> set = new TreeSet<Integer>();
		for(int i = 2; i < n ; i++){
			set.add(i);
		}
		for(int i = 1 ; i < n ; i++){
			if(slope(0, 1, i)){
				set.remove(i);
			}
		}

		if(set.size() <= 2){
			ans =  true;
		}
		else{
			int p1 = set.first();
			set.remove(p1);;
			int p2 = set.first();
			set.remove(p2);
			int flag = 0;
			for(Integer itr : set){
				if(!slope(p1, p2, itr)){
					flag = 1;
					break;
				}
			}
			if(flag == 0){
				ans = true;
			}
		}
if(ans == true){
	out.println("YES");
	return;
}
		//for s2.
		set.clear();
		for(int i = 1; i < n ; i++){
			set.add(i);
		}
		set.remove(2);
		for(int i = 1 ; i < n ; i++){
			if(slope(0, 2, i)){
				set.remove(i);
			}
		}

		if(set.size() <= 2){
			ans =  true;
		}
		else{
			int p1 = set.first();
			set.remove(p1);;
			int p2 = set.first();
			set.remove(p2);
			int flag = 0;
			for(Integer itr : set){
				if(!slope(p1, p2, itr)){
					flag = 1;
					break;
				}
			}
			if(flag == 0){
				ans = true;
			}
		}
if(ans == true){
	out.println("YES");
	return;
}

		//for s3.
		set.clear();
		for(int i = 0; i < n ; i++){
			set.add(i);
		}
		for(int i = 0 ; i < n ; i++){
			if(slope(1, 2, i)){
				set.remove(i);
			}
		}
		if(set.size() <= 2){
			ans =  true;
		}
		else{
			int p1 = set.first();
			set.remove(p1);
			int p2 = set.first();
			set.remove(p2);
			int flag = 0;
			for(Integer itr : set){
				if(!slope(p1, p2, itr)){
					flag = 1;
					break;
				}
			}
			if(flag == 0){
				ans = true;
			}
		}
		if(ans == true){
			out.println("YES");
		}
		else{
			out.println("NO");
		}
	}
	boolean slope(int a, int b, int c){
		long area = point[a][0]*(point[b][1]-point[c][1]) + point[b][0]*(point[c][1]-point[a][1]) + point[c][0]*(point[a][1]-point[b][1]);
		if(area == 0)
			return true;
		else
			return false;
	}

	void run(){
		is = new DataInputStream(System.in);
		out = new PrintWriter(System.out);
		int t=1;while(t-->0)solve();
		out.flush();
	}
	public static void main(String[] args)throws Exception{new Solution().run();}
	//Fast I/O code is copied from uwi code.
	private byte[] inbuf = new byte[1024];
	public int lenbuf = 0, ptrbuf = 0;
	private int readByte(){
		if(lenbuf == -1)throw new InputMismatchException();
		if(ptrbuf >= lenbuf){
			ptrbuf = 0;
			try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
			if(lenbuf <= 0)return -1;
		}
		return inbuf[ptrbuf++];
	}
	private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
	private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
	private double nd() { return Double.parseDouble(ns()); }
	private char nc() { return (char)skip(); }
	private String ns(){
		int b = skip();
		StringBuilder sb = new StringBuilder();
		while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}
	private char[] ns(int n){
		char[] buf = new char[n];
		int b = skip(), p = 0;
		while(p < n && !(isSpaceChar(b))){
			buf[p++] = (char)b;
			b = readByte();
		}
		return n == p ? buf : Arrays.copyOf(buf, p);
	}
	private char[][] nm(int n, int m){
		char[][] map = new char[n][];
		for(int i = 0;i < n;i++)map[i] = ns(m);
		return map;
	}
	private int[] na(int n){
		int[] a = new int[n];
		for(int i = 0;i < n;i++)a[i] = ni();
		return a;
	}
	private int ni(){
		int num = 0, b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	private long nl(){
		long num = 0;
		int b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	static  int i(long x){return (int)Math.round(x);}
	static int i(double x){return (int)Math.round(x);}
	static class Pair implements Comparable<Pair>{
		long fs,sc;
		Pair(long a,long b){
			fs=a;sc=b;
		}
		public int compareTo(Pair p){
			if(this.fs>p.fs)return 1;
			else if(this.fs<p.fs)return -1;
			else{
				return i(this.sc-p.sc);
			}
			//return i(this.sc-p.sc);
		}
		public String toString(){
			return "("+fs+","+sc+")";
		}	
	}
	
}