#include <stdio.h>
using namespace std;
#define maxn 100010
int n,a,b;
struct node{
int l,r,s;
}ac[maxn*3+5];
//建树
void build(int k,int l,int r){
ac[k].l=l;
ac[k].r=r;
ac[k].s=0;//根节点(编号为1)
if(ac[k].l==ac[k].r){//到达叶子节点(例如1--1)
return ;
}
int mid=(ac[k].l+ac[k].r)/2;
build(k*2,l,mid);//建设左边子树
build(k*2+1,mid+1,r);//建设左边子树
}
//区间更新(更新节点的s的数值)
void up(int k,int l,int r){
if(ac[k].l==l && ac[k].r==r){//寻到要更新的区间(编号为k的节点),把k的s加一;
ac[k].s++;
return ;
}
if(ac[k].l==ac[k].r){
return ;
}
int mid=(ac[k].l+ac[k].r)/2;
//要更新的区间在左子树下
if(mid>=r){
up(k*2,l,r);
}
else if(mid<l){
up(k*2+1,l,r);
}
//区间在左子树和右子树之间
else{
up(k*2,l,mid);
up(k*2+1,mid+1,r);
}
}
//查询
int query(int k,int l,int r){
if(ac[k].l==l && ac[k].r==r)
return ac[k].s;
if(ac[k].l==ac[k].r){//已经寻到叶子节点
return 0;
}
int mid=(ac[k].l+ac[k].r)/2;
if(mid>=r){
return ac[k].s+query(k*2,l,r);//l和r此刻数值相同表示叶子节点
}
else if(mid<l){
return ac[k].s+query(k*2+1,l,r);//每次加上前面的
}
else{
return ac[k].s+query(k*2,l,mid)+query(k*2+1,mid+1,r);
}
}
int main(){
while(scanf("%d",&n)!=EOF){
if(n==0) break;
build(1,1,n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
up(1,a,b);
}
for(int i=1;i<=n;i++){
printf("%d",query(1,i,i));
if(i!=n) printf(" ");
}
printf("\n");
}
return 0;
}