Code
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
const int N = 1000005;
typedef pair<int, int> PII;
PII a[N], t[N], w[N << 2];
int n;
inline void pushup(int u)
{
w[u].x = max(w[u << 1].x, w[u << 1 | 1].x);
w[u].y = min(w[u << 1].y, w[u << 1 | 1].y);
}
void build(int u,int l,int r)
{
if (l == r)
{
w[u].x = w[u].y = t[l].y;
return;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
PII query(int u,int l,int r,int L,int R)
{
if (L <= l && r <= R)
return w[u];
int mid = (l + r) >> 1;
PII res = {-2e9, 2e9};
if (L <= mid)
{
PII t = query(u << 1, l, mid, L, R);
res.x = t.x;
res.y = t.y;
}
if (mid < R)
{
PII t = query(u << 1 | 1, mid + 1, r, L, R);
res.x = max(res.x, t.x);
res.y = min(res.y, t.y);
}
return res;
}
int find1(int x)
{
int l = 1, r = n, ans = n;
while (l <= r)
{
int mid = (l + r) >> 1;
if (t[mid].x > x)
r = mid - 1, ans = mid;
else
l = mid + 1;
}
return ans;
}
int find2(int x)
{
int l = 1, r = n, ans = 1;
while (l <= r)
{
int mid = (l + r) >> 1;
if (t[mid].x < x)
l = mid + 1, ans = mid;
else
r = mid - 1;
}
return ans;
}
int main()
{
scanf("%d", &n);
if (n < 4)
{
while (n--)
putchar('1');
return 0;
}
int maxx = -2e9, minx = 2e9, maxy = -2e9, miny = 2e9;
for (int i=1;i<=n;i++)
{
scanf("%d%d", &a[i].x, &a[i].y);
t[i] = a[i];
maxx = max(maxx, a[i].x);
minx = min(minx, a[i].x);
maxy = max(maxy, a[i].y);
miny = min(miny, a[i].y);
}
sort(t + 1, t + n + 1);
build(1, 1, n);
for (int i=1;i<=n;i++)
{
if (a[i].x == maxx || a[i].x == minx || a[i].y == maxy || a[i].y == miny)
{
putchar('1');
continue;
}
int j = find1(a[i].x), k = find2(a[i].x);
PII res1 = query(1, 1, n, j, n);
PII res2 = query(1, 1, n, 1, k);
if (res1.x < a[i].y || res1.y > a[i].y || res2.x < a[i].y || res2.y > a[i].y)
putchar('1');
else
putchar('0');
}
return 0;
}