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: Wrong Answer)

#include<bits/stdc++.h>
#define int long long
#define iris 998244353
#define matsuri pair<int,int>
using namespace std;

matsuri arr[200010];
int id[200010];
stack<int> st;
vector<int> edge[200010];
int cnt[200010];
bool v[200010];

bool cmp(int a,int b)
{
	return arr[a]<arr[b];
}

int ddd(int a,int f)
{
	int res=1;
	for(int b:edge[a])
	{
		if(b==f)
			continue;
		res+=ddd(b,a);
	}
	return res;
}

void sana(int a,int f,int k)
{
	v[a]=1;
	cnt[a]=k;
	for(int b:edge[a])
	{
		if(b==f)
			continue;
		sana(b,a,k);
	}
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	int n,i,a,b,o;
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>a>>b;
		arr[i]={a,b};
		id[i]=i;
	}
	sort(id,id+n,cmp);
	for(i=0;i<n;i++)
	{
		a=id[i];
		while(!st.empty() && arr[a].second>arr[st.top()].second)
		{
			o=st.top();
			cout<<o<<' '<<a<<'\n';
			edge[o].emplace_back(a);
			edge[a].emplace_back(o);
			st.pop();
		}
		st.push(a);
	}
	for(i=0;i<n;i++)
	{
		if(!v[i])
		{
			sana(i,0,ddd(i,0));
		}
		cout<<cnt[i]<<'\n';
	}
	
	return 0;
}