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) (judge verdict: Time Limit Exceeded)

#include<iostream>
#include<cstring>
#include<set>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200010;
int n;
int tr[N];
int res[N];
struct node{
    int x;
    int y;
    int id;
    bool operator < (const node&W)const
    {
        if(x!=W.x)
        return x<W.x;
        return  y<W.y;
    }
}q[N];
int p[N];
int sz[N];
int find(int x)
{
    if(p[x]!=x)
        p[x]=find(p[x]);
    return p[x];
}
int lowbit(int x)
{
    return x&-x;
}
void add(int x,int d)
{
    for(int i=x;i<=n;i+=lowbit(i))
        tr[i]+=d;
}
void query(int x)
{
    int res=0;
    //for(int i=x;i;i-=lowbit(i))
        //p[q[i].id] = find(p[i])
//    return res;
}
bool cmp(pair<int,int>a,pair<int,int>b)
{
    if(a.first!=b.first)
        return a.first<b.first;
    else
        return a.second<b.second;
}
set<pair<int,int>>s;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&q[i].x,&q[i].y),q[i].id=i;
    for(int i=1;i<=n;i++)
        p[i]=i,sz[i]=1;
     sort(q+1,q+n+1);
   for(int i=1;i<=n;i++)
   {
            s.insert({q[i].y,q[i].id});
        auto it=s.lower_bound({q[i].y,0});
        int b=q[i].id;
        for(set<pair<int,int>>::iterator x=s.begin();x!=it;x++)
        {
            int a=x->second;
           a=find(a),b=find(b);
            if(a!=b)
            {
                p[a]=b;
                sz[b]+=sz[a];
            }

        }
   }
    s.clear();
    for(int i=n;i>=1;i--)
   {
            s.insert({q[i].y,q[i].id});
        auto it=s.upper_bound({q[i].y,q[i].id+1});
        int b=q[i].id;
        for(set<pair<int,int>>::iterator x=it;x!=s.end();x++)
        {
            int a=x->second;
            a=find(a),b=find(b);
            if(a!=b)
            {
                p[a]=b;
                sz[b]+=sz[a];
            }

        }
   }  
    for(int i=1;i<=n;i++)
        printf("%d\n",sz[find(i)]);
    return 0;
}