#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<long long> VL;
typedef vector<vector<long long>> VVL;
typedef pair<int,int> P;
typedef tuple<int,int,int> tpl;

#define ALL(a)  (a).begin(),(a).end()
#define SORT(c) sort((c).begin(),(c).end())
#define REVERSE(c) reverse((c).begin(),(c).end())
#define EXIST(m,v) (m).find((v)) != (m).end()
#define LB(a,x) lower_bound((a).begin(), (a).end(), x) - (a).begin()
#define UB(a,x) upper_bound((a).begin(), (a).end(), x) - (a).begin()

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define RFOR(i,a,b) for(int i=(a)-1;i>=(b);--i)
#define RREP(i,n) RFOR(i,n,0)

#define en "\n"

constexpr double EPS = 1e-9;
constexpr double PI  = 3.1415926535897932;
constexpr int INF = 2147483647;
constexpr long long LINF = 1LL<<60;
constexpr long long MOD = 1000000007; // 998244353;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }

VI u,v;

struct UnionFind{
    vector<int> par; // par[i]:iの親の番号
    vector<int> s; // s[i]:iの属する木のノード数
    int n_group; // 木の数
    
    UnionFind(int N) : par(N) {
        for(int i=0; i<N; i++) par[i] = i;
        s.assign(N, 1);
        n_group = N;
    }
    
    int root(int x){ // xが属する木の根
        if(par[x] == x) return x;
        return par[x] = root(par[x]);
    }
    
    void unite(int x, int y){ // xとyの木を併合
        int rx = root(x);
        int ry = root(y);
        if(rx == ry) return;
        if(u[rx]<u[ry]){
            par[ry] = rx;
            s[rx] += s[ry];
            s[ry] = 0;
        }
        else{
            par[rx] = ry;
            s[ry] += s[rx];
            s[rx] = 0;
        }
        n_group--;
    }
    
    bool same(int x, int y){ // xとyが同じ木に属するかどうか
        return root(x) == root(y);
    }

    int size(int x){ // xが属する木のノード数
        return s[root(x)];
    }
};

void Main(){
    int N; cin >> N;
    u.resize(N); v.resize(N);
    REP(i,N) cin >> u[i] >> v[i];

    UnionFind uf1(N), uf2(N), uf(N);

    auto c = [&](int i, int j){
        return v[i]<v[j];
    };
    VI p(N); REP(i,N) p[i] = i;
    sort(ALL(p), c);

    priority_queue<P,vector<P>,greater<P>> q;
    for(int i : p){
        VI v{i}; set<int> s;
        while(!q.empty() && q.top().first < u[i]){
            P pa = q.top(); q.pop();
            uf1.unite(i,pa.second);
            uf.unite(i,pa.second);
            v.push_back(pa.second);
        }

        for(int j : v) s.insert(uf1.root(j));
        for(int j : s) q.emplace(u[j],j);
    }

    REP(i,N){ u[i] = -u[i]; v[i] = -v[i]; }

    sort(ALL(p), c);

    while(!q.empty()) q.pop();

    for(int i : p){
        VI v{i}; set<int> s;
        while(!q.empty() && q.top().first < u[i]){
            P pa = q.top(); q.pop();
            uf2.unite(i,pa.second);
            uf.unite(i,pa.second);
            v.push_back(pa.second);
        }

        for(int j : v) s.insert(uf1.root(j));
        for(int j : s) q.emplace(u[j],j);
    }

    REP(i,N) cout << uf.size(i) << en;
    return;
}

int main(void){
    cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0);cout<<fixed<<setprecision(15);
    int t=1; //cin>>t;
    REP(_,t) Main();
    return 0;
}

Measured memory_bytes: 12396