//g++ t.cpp -o t && t < p.txt
//d>p.txt&&t<p.txt&&t2<p.txt

#include <iostream> // プログラムの耳と口
#include <vector> // 超有能配列秘書
#include <algorithm> // みんな大好きソートと二分探索
#include <queue> // きゅーちゃん、だいすき
#include <string> // to_string
#include <functional> // 関数を変数に入れる子
#include <set> // 値の取得・挿入・削除を高速に
#include <map> // setの妹 これまた優秀
#include <random> // 乱択さん
#include <ctime> // へびになりたい
#include <bitset> // へびになった ｼｬｰ

#include <atcoder/all>
using namespace atcoder; // コンパイル重い

#define DB cerr<<"D"<<endl

using namespace std; using ll=long long; using ld=long double; const int INF=1e9; const ll LINF=1e18; const double dINF = 1e18; const ld ldINF = 1e18; const double EPS = 1e-6;
template<typename T, typename U, typename O> void caut(T a, U b, O c){cout<<"("<<a<<","<<b<<","<<c<<") ";} template<typename T, typename U> void caut(T a, U b){cout<<"("<<a<<","<<b<<") ";} template<typename T> void caut(T a){cout<<"("<<a<<") ";};
using P=pair<ll,ll>;
const ll M = 998244353;
ll mod_pow(ll x, ll a) { ll an = 1; while(a > 0) { if (a&1) an = an * x % M; x = x * x % M; a >>= 1;} return an;}
ll mod_pow(ll x, ll a, ll m) { ll an = 1; while(a > 0) { if (a&1) an = an * x % m; x = x * x % m; a >>= 1;} return an;}
void add(ll& x, ll y) {x+=y; x%=M;}; void mul(ll& x, ll y) {x*=y; x%=M;}; template<typename T, typename U> void chmax(T& x, U y) {if (x<y) x=y;}; template<typename T, typename U> void chmin(T& x, U y) {if (x>y) x=y;}
bool vaild(int x, int y, int hh, int ww){return 0<=x&&x<hh&&0<=y&&y<ww;}
int keta(ll a) {int res=0; while(a>0) res+=a%10, a/=10; return res;}
const int up[]={1,-1,0,0}, lf[]={0,0,1,-1};
ll gcd(ll a, ll b) {if (b==0) return a; else return gcd(b, a%b);}

int op(int a, int b){return min(a,b);}
int mapping(int a, int b){return min(a,b);}
int composition(int a, int b){return min(a,b);}
int n0;
int e(){return n0-2;}
int id(){return n0-2;}

struct tup {
  int x,y,c;
  bool operator<(const tup tt) const {
    if (x != tt.x) return x < tt.x;
    else if (y != tt.y) return y < tt.y;
    else return c < tt.c;
  }
  bool operator>(const tup tt) const {
    if (x != tt.x) return x > tt.x;
    else if (y != tt.y) return y > tt.y;
    else return c > tt.c;
  }
};

int main() {
  int n; cin>>n;
  tup p[n];
  for(int i=0;i<n;i++) {
    cin>>p[i].x>>p[i].y; p[i].c=i; p[i].x--; p[i].y--;
  }
  dsu d(n);
  {
    sort(p,p+n);
    priority_queue<P, vector<P>, greater<P>> que;
    for(int i=0;i<n;i++) {
      int u = p[i].y;
      int xx = INF;
      //cout << p[i].x << " " << p[i].y << " " << p[i].c << endl;
      while(!que.empty()) {
        P gt = que.top();
        if (gt.first < u) {
          //cout << "@" << gt.first << " " << gt.second << endl;
          int id = gt.second;
          d.merge(p[i].c, id);
          xx = min(xx, (int)gt.first);
          que.pop();
        } else {
          break;
        }
      }
      if (xx != INF) {
        que.push({xx, p[i].c});
        //cout<<xx<<" " <<i<<endl;
      }
      que.push({p[i].y, p[i].c});
    }
  }

  for(int i=0;i<n;i++) {
    p[i].x = n-1-p[i].x;  p[i].y = n-1-p[i].y; 
  }
  
  {
    sort(p,p+n);
    priority_queue<P, vector<P>, greater<P>> que;
    for(int i=0;i<n;i++) {
      int u = p[i].y;
      int xx = INF;
      while(!que.empty()) {
        P gt = que.top();
        if (gt.first < u) {
          //cout << gt.first << " " << gt.second << endl;
          int id = gt.second;
          d.merge(p[i].c, id);
          xx = min(xx, (int)gt.first);
          que.pop();
        } else {
          break;
        }
      }
      if (xx != INF) {
        que.push({xx, p[i].c});
      }
      que.push({p[i].y, p[i].c});
    }
  }

  for(int i=0;i<n;i++) {
    cout<<d.size(i)<<endl;
  }
}
// ・配列の大きさok？　・priority_queueはgreater？　・debug消した？
// ・落ち着いて。提出まで4分待ってね……WJ……1/10……2/10……

// Thank you for making problems and running the contest


Measured memory_bytes: 9116