#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
#pragma GCC optimize("unroll-loops")
//#pragma warning(disable : 4996)


#ifdef _MSC_VER
#include <intrin.h>

#define __builtin_popcount __popcnt
#define __builtin_popcountll __popcnt64
#endif

#include <limits.h>
#include <math.h>
#include <time.h>

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include<atcoder/all>


using namespace std;
using namespace atcoder;


#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REPR(i, n) for (int i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (int i = m; i < n; ++i)
#define FORR(i, m, n) for (int i = m - 1; i >= n; --i)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define REVERSE(v, n) reverse(v, v + n);
#define VREVERSE(v) reverse(v.begin(), v.end())
using ll = long long;
#define print(x) cout << (x) << endl
#define pe(x) cout << (x) << " "
#define DEBUG(x) cout << #x << ": " << x << endl
#define lb(v, n) lower_bound(v.begin(), v.end(), (n))
#define ub(v, n) upper_bound(v.begin(), v.end(), (n))
#define int long long
//#define double long double
#define all(x) (x).begin(), (x).end()
#define print_space(v) REP(i, v.size()) cout << v[i] << " \n"[i==(int)v.size()-1]
template <typename T1, typename T2> inline void chmin(T1& a, T2 b) { if (a > b) a = b; }
template <typename T1, typename T2> inline void chmax(T1& a, T2 b) { if (a < b) a = b; }
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
std::random_device rd;
std::mt19937 mt(rd());
constexpr ll MOD = 1e9+7;
constexpr int MAX = 300010;
const double pi = acos(-1);
constexpr double EPS = 1e-8;
constexpr ll LINF = 1e18 + 1;
constexpr int INF = 1e9 + 1;
void Yes(bool cond) { cout << (cond ? "Yes" : "No") << '\n'; }
void YES(bool cond) { cout << (cond ? "YES" : "NO") << '\n'; }



template<typename T>
struct SegmentTree {
	int n;
	T unit;
	vector<T>dat;
	function<T(T, T)> func;
	SegmentTree(const int N, T _unit, function<T(T, T)> _func)
		:unit(_unit), func(_func) {
		n = 1;
		//簡単のため、要素数を2のべき乗に
		while (n < N)n *= 2;
		dat.assign(2 * n, unit);
	}

	void update(int k, T a) {
		k += n - 1;//葉の節点
		dat[k] = a;
		//上りながら更新
		while (k > 0) {
			k = (k - 1) / 2;
			dat[k] = func(dat[k * 2 + 1], dat[k * 2 + 2]);
		}
	}
	T _query(int a, int b, int k, int l, int r) {
		//[a,b)と[l,r)が交差していなければ、funcに影響を与えない値を返す
		if (r <= a || b <= l)return unit;
		//[a,b)が[l,r)を完全に含んでいれば、この節点の値
		if (a <= l && r <= b)return dat[k];
		else {
			T vl = _query(a, b, k * 2 + 1, l, (l + r) / 2);
			T vr = _query(a, b, k * 2 + 2, (l + r) / 2, r);
			return func(vl, vr);
		}
	}
	//[a,b)
	T query(int a, int b) {
		return _query(a, b, 0, 0, n);
	}
};

struct UnionFind {
	int N;
	vector<int> siz;
	vector<int> par;
	vector<int> Rank;
	UnionFind(int n) : siz(n, 1), par(n), Rank(n, 0) {
		N = n;
		for (int i = 0; i < N; i++) par[i] = i;
	}
	int find(int x) {
		if (par[x] == x) {
			return x;
		}
		else {
			return par[x] = find(par[x]);
		}
	}
	void unite(int x, int y) {
		x = find(x);
		y = find(y);
		if (x == y) return;
		if (Rank[x] < Rank[y]) {
			par[x] = y;
			siz[x] += siz[y];
			siz[y] = siz[x];
		}
		else {
			siz[y] += siz[x];
			siz[x] = siz[y];
			par[y] = x;
			if (Rank[x] == Rank[y]) Rank[x]++;
		}
	}
	bool same(int x, int y) { return find(x) == find(y); }
};
void solve() {
	auto f = [](int a, int b) {return a + b; };


	int N; cin >> N;
	vector<int>X(N), Y(N);
	REP(i, N)cin >> X[i] >> Y[i];
	using arr3 = array<int, 3>;
	vector<arr3>v(N);
	REP(i, N) {
		v[i] = { X[i] - 1,Y[i] - 1 ,i};
	}
	VSORT(v);
	vector<int>ans(N,1);
	//SegmentTree<int>segL(N+1, 0, f),segR(N+1,0,f);
	//REP(i, N) {
	//	int x = v[i][0];
	//	int y = v[i][1];
	//	int id = v[i][2];
	//	ans[id] += segL.query(0, y);
	//	segL.update(y, 1);
	//}
	//REPR(i, N) {
	//	int x = v[i][0];
	//	int y = v[i][1];
	//	int id = v[i][2];
	//	ans[id] += segR.query(y+1, N);
	//	segR.update(y, 1);
	//}
	//REP(i, N) {
	//	print(ans[i]);
	//}
	UnionFind uf(N);
	int mn = INF;
	int idx = -1;
	priority_queue<pii,vector<pii>,greater<pii>>que;
	REP(i, N) {
		int y = v[i][1], id = v[i][2];
		vector<pii>tmp;
		while (!que.empty()) {
			pii p = que.top();
			if (p.first > y)break;
			tmp.push_back(p);
			que.pop();
		}
		for (auto p : tmp) {
			uf.unite(p.second, id);
		}
		if(!tmp.empty())que.push(tmp[0]);
		que.push({ y,id });
	}
	REP(i, N) {
		print(uf.siz[uf.find(i)]);
	}
}




signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	//int q;
	//cin >> q;
	//while (q--)
	solve();

}


Measured memory_bytes: 18000