#include <iostream>
#include <algorithm>
using namespace std;
using pii = pair<int, int>;
const int N = 2e5 + 7;
struct Node {
int first, second, pos;
bool operator< (const Node &B) const {
return first < B.first;
}
} a[N];
pii mn[N], mx[N];
int fa[N], sz[N], ans[N];
int find(int k) { return fa[k]==k ? k : fa[k]=find(fa[k]); }
void merge(int u, int v) {
int x = find(u), y = find(v);
if (x == y) return;
if (sz[x] > sz[y]) fa[y] = x, sz[x] += sz[y];
else fa[x] = y, sz[y] += sz[x];
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d%d", &a[i].first, &a[i].second);
a[i].pos = i, fa[i] = i, sz[i] = 1;
}
sort(a+1, a+n+1);
mn[0] = {2e9, 0}, mx[n+1] = {-2e9, n+1};
for (int i = 1; i <= n; ++i) {
mn[i] = mn[i-1];
if (a[i].second < mn[i].first)
mn[i] = {a[i].second, i};
}
for (int i = n; i; --i) {
mx[i] = mx[i+1];
if (a[i].second > mx[i].first)
mx[i] = {a[i].second, i};
}
for (int i = 1; i <= n; ++i) {
if (mn[i].first < a[i].second) merge(i, mn[i].second);
if (mx[i].first > a[i].second) merge(i, mx[i].second);
}
for (int i = 1; i <= n; ++i)
ans[a[i].pos] = sz[find(i)];
for (int i = 1; i <= n; ++i)
printf("%d\n", ans[i]);
return 0;
}