#include <bits/stdc++.h>
using namespace std;
struct point
{
	int x,y,left,top;
	//friend bool operator <(point x,point y){ if (x.x!=y.x)return x.x<y.x; return x.y>y.y; }
	friend bool operator <(point x,point y){ return x.x<y.x;  }
}a[510000];
struct node
{
	int l,r,sum;
}st[10000000];
int tot,n;
int newnode(){ tot++; st[tot].l=st[tot].r=st[tot].sum=0; return tot; }
void insert(int t1,int t2,int l,int r,int k)
{
	st[t2]=st[t1];
	if (l==r){ st[t2].sum++; return; }
	int mid=(l+r)/2;
	if (k<=mid){ st[t2].l=newnode(); insert(st[t1].l,st[t2].l,l,mid,k); }
	else { st[t2].r=newnode(); insert(st[t1].r,st[t2].r,mid+1,r,k); }
	st[t2].sum=st[st[t2].l].sum+st[st[t2].r].sum;
}
int getsum(int t1,int t2,int l,int r,int a,int b)
{
	if (a>b)return 0;
	if (a<=l && r<=b)return st[t2].sum-st[t1].sum;
	int mid=(l+r)/2; int ans=0;
	if (a<=mid)ans+=getsum(st[t1].l,st[t2].l,l,mid,a,b);
	if (b>mid)ans+=getsum(st[t1].r,st[t2].r,mid+1,r,a,b);
	return ans;
}
vector<int> save[50010];
int root[50010];
bool cmp1(int x,int y){ return a[x].y>a[y].y; }
bool cmp2(int x,int y){ return a[x].x<a[y].x; }
int mx[50100],my[50100];
bool check()
{
	
	for(int i=1;i<=50000;i++)save[i].clear();
	for(int i=1;i<=n;i++)save[a[i].x].push_back(i);
	for(int i=1;i<=50000;i++)sort(save[i].begin(),save[i].end(),cmp1);
	for(int i=1;i<=n;i++)a[i].top=50001;
	for(int i=1;i<=50000;i++){ if (save[i].size()<=1)continue; int cnt=save[i].size(); for(int j=1;j<cnt;j++)a[save[i][j]].top=a[save[i][j-1]].y; }
	
	for(int i=1;i<=50000;i++)save[i].clear();
	for(int i=1;i<=n;i++)save[a[i].y].push_back(i);
	for(int i=1;i<=50000;i++)sort(save[i].begin(),save[i].end(),cmp2);
	for(int i=1;i<=n;i++)a[i].left=0;
	for(int i=1;i<=50000;i++){ if (save[i].size()<=1)continue; int cnt=save[i].size(); for(int j=1;j<cnt;j++)a[save[i][j]].left=a[save[i][j-1]].x; }
	
	//for(int i=1;i<=n;i++)printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].left,a[i].top);
	//memset(mx,0,sizeof(mx));  method 2
	//memset(my,0,sizeof(my));  method 2
	a[0].x=0,a[0].y=50001;
	
	tot=-1; newnode(); root[0]=newnode(); int preroot=root[0];
	for(int i=1;i<=n;i++)
	{
		int x1=a[i].x,y1=a[i].y;
		//int x2=a[my[y1]].x,y2=a[mx[x1]].y; method 2
		int x2=a[i].left,y2=a[i].top;
		root[x1]=preroot;
		int t=getsum(root[x2],root[x1],1,50000,y1+1,y2-1); if (t!=0)return 0; 
		root[x1]=newnode();
		insert(preroot,root[x1],1,50000,y1);
		//mx[a[i].x]=i; my[a[i].y]=i; method 2
		preroot=root[a[i].x];
	}
	return 1;
}
int main()
{
	while (1)
	{
		scanf("%d",&n); if(n==0)break;
		for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
		int cnt=0;
		sort(a+1,a+n+1);
		for(int i=1;i<=n;i++)
		{
			if (i>1 && a[i].x==a[i-1].x && a[i].y==a[i-1].y)continue;
			a[++cnt]=a[i];
		}
		n=cnt;
		if (!check()){ puts("NO"); continue; }
		for(int i=1;i<=n;i++)a[i].x=50000-a[i].x+1;;
		sort(a+1,a+n+1);
		if (!check()){ puts("NO"); continue; }
		puts("YES");
	}
}

