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>

using namespace std;
using ll = long long;

const int N = 1e6 + 5, MOD = 1e9 + 7;
const ll INF = 1e18 + 17;

int n, x[N], y[N], p[N], sz[N];

int get(int v) {
	if (p[v] == v) {
		return v;
	}
	return p[v] = get(p[v]);
}

void unite(int a, int b) {
	a = get(a), b = get(b);
	if (sz[a] < sz[b]) {
		swap(a, b);
	}
	sz[a] += sz[b];
	p[b] = a;
}

void solve() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		p[i] = i;
		sz[i] = 1;
	}
	for (int i = 1; i <= n; ++i) {
		cin >> x[i] >> y[i];
	}
	vector <pair <pair <int, int>, int> > pr;
	for (int i = 1; i <= n; ++i) {
		pr.push_back({{x[i], y[i]}, i});
	}
	sort(pr.begin(), pr.end());
	set <pair <pair <int, int>, int> > st;
	for (int i = n - 1; i >= 0; i--) {
		auto p = pr[i].first;
		auto it = st.upper_bound({{p.second, 0}, 0});
		while (it != st.end() && get(pr[i].second) != get(it -> second)) {
			unite(pr[i].second, it -> second);
			++it;
		}
		st.insert({{p.second, p.first}, pr[i].second});
	}
	pr.clear();
	for (int i = 1; i <= n; ++i) {
		pr.push_back({{y[i], x[i]}, i});
	}
	st.clear();
	for (int i = 0; i <= n - 1; ++i) {
		auto p = pr[i].first;
		auto it = st.lower_bound({{p.second, 0}, 0});
		if (it != st.begin()) {
			it--;
			while (get(pr[i].second) != get(it -> second)) {
				unite(pr[i].second, it -> second);
				if (it == st.begin()) {
					break;
				}
				it--;
			}
		}
		st.insert({{p.second, p.first}, pr[i].second});
	}
	for (int i = 1; i <= n; ++i) {
		cout << sz[get(i)] << '\n';
	}
}

main() {
	ios :: sync_with_stdio(0);		
	cin.tie(0);
	int tt = 1;
	//cin >> tt;
	while (tt--) {
		solve();
		cout << '\n';
	} 
	return 0;
}