#include <bits/stdc++.h>
using namespace std;
#include <math.h>
#include <iomanip>
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const int INF=1001001001;
const long long mod=998244353;

struct Unionfind{
  vector<int>d;
  Unionfind(int n):d(n,-1){}
  int root(int x){
    if(d[x]<0){return x;}
    return d[x]=root(d[x]);
  }
  bool unite(int x,int y){
    x=root(x);y=root(y);
    if(x==y){return false;}
    if(d[x]>d[y]){swap(x,y);}
    d[x]+=d[y];
    d[y]=x;
    return true;
  }
  bool same(int x,int y){return root(x)==root(y);}
  int size(int x){return -d[root(x)];}
};
 
int main(){
  int N;
  cin>>N;
  Unionfind uf(N);
  vector<int>y(N);
  vector<int>id(N);
  for(int i=0;i<N;i++){
    int X,Y;
    cin>>X>>Y;
    X--;Y--;
    y[X]=Y;
    id[i]=Y;//yの値でグループを作るので、i番目のグループのサイズを出力するときはi番目のyの値のグループを見る
  }
  set<int>s;
  for(int x=0;x<N;x++){
    int MIN=y[x];
    while(!s.empty()&&*begin(s)<y[x]){//cout<<"a"<<x<<" "<<*begin(s)<<endl;
      uf.unite(y[x],*begin(s));
      chmin(MIN,*begin(s));
      s.erase(s.begin());
    }
    s.insert(MIN);
  }
  for(int i=0;i<N;i++){
    cout<<uf.size(id[i])<<endl;
  }
  return 0;                       
}