#include<bits/stdc++.h>
#define int long long
using namespace std;
#define N 1000010
int n,maxn,minn,mmaxn,mminn;
bool f[N],vis[N];
struct node{int x,y,id;}p[N];
bool cmpx(node a,node b){return a.x<b.x;}
bool cmpy(node a,node b){return a.y<b.y;}
void update(int x){
maxn=max(maxn,x);
minn=min(minn,x);
return;
}
void update2(int x){
mmaxn=max(mmaxn,x);
mminn=min(mminn,x);
return;
}
bool check(int x){
return (mmaxn<x||mminn>x);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
p[i].id=i;
}
sort(p+1,p+n+1,cmpy);
maxn=-1e18,minn=1e18;
mmaxn=-1e18,mminn=1e18;
for(int i=1;i<=n;i++){
int l=i-1;
while(l>0&&p[l].y==p[i-1].y&&p[l].y!=p[i].y){
update(p[l].x);
l--;
}
if(check(p[i].x)||(maxn<p[i].x&&minn>p[i].x))f[p[i].id]=true;
update2(p[i].x);
}
maxn=-1e18,minn=1e18;
mmaxn=-1e18,mminn=1e18;
for(int i=n;i>0;i--){
int l=i+1;
while(l<=n&&p[l].y==p[i+1].y&&p[l].y!=p[i].y){
update(p[l].x);
l++;
}
if(check(p[i].x)||(maxn<p[i].x&&minn>p[i].x))f[p[i].id]=true;
update2(p[i].x);
}
sort(p+1,p+n+1,cmpx);
maxn=-1e18,minn=1e18;
mmaxn=-1e18,mminn=1e18;
for(int i=1;i<=n;i++){
int l=i-1;
while(l>0&&p[l].x==p[i-1].x&&p[l].x!=p[i].x){
update(p[l].y);
l--;
}
if(check(p[i].y)||(maxn<p[i].y&&minn>p[i].y))f[p[i].id]=true;
update2(p[i].y);
}
maxn=-1e18,minn=1e18;
mmaxn=-1e18,mminn=1e18;
for(int i=n;i>0;i--){
int l=i+1;
while(l<=n&&p[l].x==p[i+1].x&&p[l].x!=p[i].x){
update(p[l].y);
l++;
}
if(check(p[i].y)||(maxn<p[i].y&&minn>p[i].y))f[p[i].id]=true;
update2(p[i].y);
}
for(int i=1;i<=n;i++){
if(f[i])cout<<'1';
else cout<<'0';
}
return 0;
}