This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
#define fir first
#define sec second
#define pushf push_front
#define pushb push_back
#define popf pop_front
#define popb pop_back
#define mp make_pair
#define all(a) a.begin(), a.end()
#define FOR(i, s, e) for(int i = s; i < e; i++)
#define RFOR(i, s, e) for(int i = e-1; i >= s; i--)
#define REP(i, n) FOR(i, 0, n)
#define RREP(i, n) RFOR(i, 0, n)
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef vector<vb> vvb;
typedef vector<vc> vvc;
typedef vector<vpii> vvpii;
typedef vector<vpll> vvpll;
typedef queue<int> qi;
typedef queue<ll> qll;
typedef queue<pii> qpii;
typedef queue<pll> qpll;
typedef deque<int> dqi;
typedef deque<ll> dqll;
typedef deque<pii> dqpii;
typedef deque<pll> dqpll;
typedef priority_queue<int> pqi;
typedef priority_queue<ll> pqll;
typedef priority_queue<pii> pqpii;
typedef priority_queue<pll> pqpll;
typedef priority_queue<int, vi, greater<int> > r_pqi;
typedef priority_queue<ll, vll, greater<ll> > r_pqll;
typedef priority_queue<pii, vpii, greater<pii> > r_pqpii;
typedef priority_queue<pll, vpll, greater<pll> > r_pqpll;
const int M = 1e6+5;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    vpii cities(n);
    vvi X(M);
    REP(i, n) {
        int x, y;
        cin>>x>>y;
        cities[i] = {x, y};
        X[x].pushb(y);
    }
    REP(i, M) {
        sort(all(X[i]));
    }
    vpii up(M, {M, M}), down(M);
    vpii chose(M, {-1, -1});
    REP(i, M) {
        int l = X[i].size();
        if(l == 0) {
            continue;
        }
        up[X[i][0]] = min(up[X[i][0]], {i, 0});
        down[X[i][0]] = max(down[X[i][0]], {i, 0});
        up[X[i][l-1]] = min(up[X[i][l-1]], {i, l-1});
        down[X[i][l-1]] = max(down[X[i][l-1]], {i, l-1});
        chose[i] = {0, l-1};
    }
    auto check = [&](int x, int y) -> bool {
        return (up[y].fir < x && x < down[y].fir);
    };
    qpii rem;
    REP(i, M) {
        int l = X[i].size();
        if(l == 0) {
            continue;
        }
        if(check(i, X[i][0])) {
            rem.push({i, 0});
            //cerr<<i<<' ';
        }
        if(l > 1 && check(i, X[i][l-1])) {
            rem.push({i, l-1});
            //cerr<<i<<' ';
        }
    }
    while(!rem.empty()) {
        auto [x, ind] = rem.front();
        rem.pop();
        auto [a, b] = chose[x];
        if(a == ind) {
            do {
                a++;
            } while(a <= b && check(x, X[x][a]));
            if(a > b) {
                chose[x] = {-1, -1};
                continue;
            }
            if(x < up[X[x][a]].fir) {
                if(up[X[x][a]].fir != down[X[x][a]].fir) {
                    rem.push(up[X[x][a]]);
                }
                up[X[x][a]] = {x, a};
            }
            if(down[X[x][a]].fir < x) {
                if(up[X[x][a]].fir != down[X[x][a]].fir) {
                    rem.push(down[X[x][a]]);
                }
                down[X[x][a]] = {x, a};
            }
        }
        else {
            do {
                b--;
            } while(a <= b && check(x, X[x][b]));
            if(a > b) {
                chose[x] = {-1, -1};
                continue;
            }
            if(x < up[X[x][b]].fir) {
                if(up[X[x][b]].fir != down[X[x][b]].fir) {
                    rem.push(up[X[x][b]]);
                }
                up[X[x][b]] = {x, b};
            }
            if(down[X[x][b]].fir < x) {
                if(up[X[x][b]].fir != down[X[x][b]].fir) {
                    rem.push(down[X[x][b]]);
                }
                down[X[x][b]] = {x, b};
            }
        }
        chose[x] = {a, b};
    }
    /*
    REP(i, 11) {
        cerr<<up[i].fir<<' '<<down[i].fir<<endl;
    }
    */
    map<pii, bool> ans;
    REP(i, M) {
        if(chose[i].fir == -1) {
            continue;
        }
        ans[{i, X[i][chose[i].fir]}] = true;
        ans[{i, X[i][chose[i].sec]}] = true;
    }
    REP(i, n) {
        if(ans[cities[i]]) {
            cout<<1;
        }
        else {
            cout<<0;
        }
    }
}
/*
16
9 10
2 10
5 10
6 3
6 1
5 8
6 7
9 8
4 3
6 10
4 8
2 7
2 1
5 7
4 1
9 3
*/
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:103:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  103 |         auto [x, ind] = rem.front();
      |              ^
Main.cpp:105:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  105 |         auto [a, b] = chose[x];
      |              ^| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |