//clear adj and visited vector declared globally after each test case
//check for long long overflow
//while adding and subs check if mod becomes -ve
//while using an integer directly in a builtin function add ll
//Mod wale question mein last mein if dalo ie. Ans<0 then ans+=mod;
//Dont keep array name as size or any other key word
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define int long long
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL);cout.precision(dbl::max_digits10);
#define pb push_back
#define mod 1000000007ll //998244353ll
#define lld long double
#define mii map<int, int>
#define mci map<char, int>
#define msi map<string, int>
#define pii pair<int, int>
#define ff first
#define ss second
#define all(x) (x).begin(), (x).end()
#define rep(i,x,y) for(int i=x; i<y; i++)
#define fill(a,b) memset(a, b, sizeof(a))
#define vi vector<int>
#define setbits(x) __builtin_popcountll(x)
#define print2d(dp,n,m) for(int i=0;i<=n;i++){for(int j=0;j<=m;j++)cout<<dp[i][j]<<" ";cout<<"\n";}
typedef std::numeric_limits< double > dbl;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
const long long N=200005, INF=2000000000000000000;
lld pi=3.1415926535897932;
int lcm(int a, int b)
{
int g=__gcd(a, b);
return a/g*b;
}
int power(int a, int b, int p)
{
if(a==0)
return 0;
int res=1;
a%=p;
while(b>0)
{
if(b&1)
res=(res*a)%p;
b>>=1;
a=(a*a)%p;
}
return res;
}
int par[N],siz[N];
int findset(int a)
{
if(par[a]==a)
return a;
return par[a]=findset(par[a]);
}
void unionset(int a, int b)
{
a=findset(a);
b=findset(b);
if(a==b)
return;
if(siz[a]>siz[b])
swap(a, b);
par[a]=b;
siz[b]+=siz[a];
}
int32_t main()
{
IOS;
int n;
cin>>n;
vector <pair<pii, int> > v(n);
for(int i=0;i<n;i++)
{
siz[i]=1;
par[i]=i;
}
for(int i=0;i<n;i++)
{
cin>>v[i].ff.ff>>v[i].ff.ss;
v[i].ss=i;
}
sort(all(v));
stack <pii> s;
for(int i=0;i<n;i++)
{
int x=v[i].ff.ff, y=v[i].ff.ss, ind=v[i].ss;
//cout<<x<<" "<<y<<" "<<ind<<"\n";
int z=y;
while(!s.empty() && s.top().ff<y)
{
z=min(z, s.top().ff);
unionset(ind, s.top().ss);
s.pop();
}
s.push({z, ind});
}
for(int i=0;i<n;i++)
cout<<siz[findset(i)]<<"\n";
}