Problem:
Score : 300 points

Problem Statement

There are N cities on a 2D plane. The coordinate of the i-th city is (x_i, y_i). Here (x_1, x_2, \dots, x_N) and (y_1, y_2, \dots, y_N) are both permuations of (1, 2, \dots, N).

For each k = 1,2,\dots,N, find the answer to the following question:

Rng is in City k.
Rng can perform the following move arbitrarily many times:

move to another city that has a smaller x-coordinate and a smaller y-coordinate, or a larger x-coordinate and a larger y-coordinate, than the city he is currently in.

How many cities (including City k) are reachable from City k?

Constraints

1 \leq N \leq 200,000

(x_1, x_2, \dots, x_N) is a permutation of (1, 2, \dots, N).

(y_1, y_2, \dots, y_N) is a permutation of (1, 2, \dots, N).

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
x_2 y_2
:
x_N y_N

Output

Print N lines. In i-th line print the answer to the question when k = i.

Sample Input 1

4
1 4
2 3
3 1
4 2

Sample Output 1

1
1
2
2

Rng can reach City 4 from City 3, or conversely City 3 from City 4.

Sample Input 2

7
6 4
4 3
3 5
7 1
2 7
5 2
1 6

Sample Output 2

3
3
1
1
2
3
2

Solution in C++ (GCC 9.2.1 with AC Library v1.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
const int maxn=200010;
int n;
struct dat{
    int id,x,y,ans;
}a[maxn];
bool cmp1(dat a,dat b){
    return a.id<b.id;
}
bool cmp2(dat a,dat b){
    return a.x<b.x;
}
int fa[maxn],sz[maxn],mxid[maxn];
int fd(int x){
    if(!fa[x])return x;
    else return fa[x]=fd(fa[x]);
}

void solve(){
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>a[i].x>>a[i].y;
        a[i].id=i;
    }
    sort(a+1,a+n+1,cmp2);
    int mx=0;
    for(int i=n;i;--i){
        sz[i]=1;
        if(mx<a[i].y){
            mx=a[i].y;
            mxid[i]=i;
        }
        else{
            mxid[i]=mxid[i+1];
        }
    }
    for(int i=1,x,y;i<n;++i){
        x=i;
        y=mxid[i+1];
        if(a[x].y<a[y].y){
            if(fd(x)!=fd(y)){
                sz[fd(y)]+=sz[fd(x)];
                fa[fd(x)]=fd(y);
            }
        }
    }
    mx=a[1].y;
    mxid[1]=1;
    for(int i=2;i<=n;++i){
        if(mx>a[i].y){
            mxid[i]=i;
        }
        else{
            for(int t=i-1;;t=mxid[t]-1){
                mxid[i]=mxid[t];
                if(t==1||fd(t)!=fd(i))break;
            }
        }
    }
    //for(int i=1;i<=n;++i)
    //    cerr<<mxid[i]<<" ";
    //cerr<<"\n";
    for(int i=n,x,y;i>=2;--i){
        x=i;
        y=mxid[i];
        if(a[x].y>a[y].y){
            if(fd(x)!=fd(y)){
                sz[fd(y)]+=sz[fd(x)];
                fa[fd(x)]=fd(y);
            }
        }
    }
    for(int i=1;i<=n;++i){
        a[i].ans=sz[fd(i)];
    }
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;++i){
        printf("%d\n",a[i].ans);
    }
}
int main(){
    solve();
    return 0;
}
/*
4
1 2
2 4
3 1
4 3
*/