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: Accepted)

#include<bits/stdc++.h>

using namespace std;

#define FOR(i, x, y) for(int i = (x); i < (y); ++i)
#define REP(i, x, y) for(int i = (x); i <= (y); ++i)
#define PB push_back
#define MP make_pair
#define PH push
#define fst first
#define snd second
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;

const int maxn = 2e5 + 5;

int n;
int x[maxn], y[maxn], xr[maxn], yr[maxn], p[maxn], q[maxn], ans[maxn], l[maxn], r[maxn], u[maxn], d[maxn];

class DSU{
public:
	int fa[maxn], sz[maxn];
	inline void init(){ FOR(i, 0, maxn) fa[i] = i, sz[i] = 1; return; }
	inline int find(int x){ return (x == fa[x] ? fa[x] : fa[x] = find(fa[x])); }
	inline void combine(int x, int y){
		x = find(x), y = find(y);
		if(x == y)
			return;
		fa[x] = y;
		sz[y] += sz[x];
		return; 
	}
}dsu;

int main(){
	scanf("%d", &n);
	FOR(i, 0, n){
		scanf("%d%d", x + i, y + i);
		--x[i]; --y[i];
		xr[x[i]] = i; yr[y[i]] = i;
		p[x[i]] = y[i];
		q[y[i]] = x[i];
	}
	
	dsu.init();

	pii val = MP(n, -1);
	FOR(i, 0, n){
		int id = xr[i];
		val = min(val, MP(y[id], id));
		dsu.combine(id, val.snd);
	}
	val = MP(n, -1);
	FOR(i, 0, n){
		int id = yr[i];
		val = min(val, MP(x[id], id));
		dsu.combine(id, val.snd);
	}
	val = MP(-1, -1);
	for(int i = n - 1; i >= 0; --i){
		int id = yr[i];
		val = max(val, MP(x[id], id));
		dsu.combine(id, val.snd);
	}
	val = MP(-1, -1);
	for(int i = n - 1; i >= 0; --i){
		int id = xr[i];
		val = max(val, MP(y[id], id));
		dsu.combine(id, val.snd);
	}
	
	FOR(i, 0, n)
		printf("%d\n", dsu.sz[dsu.find(i)]);
	return 0;
}