/*
ID:billat11
LANG:C
TASK:namenum
*/
#include<iostream>
#include<cstdio>
#include<cstdarg>
#include<stdlib.h>
#include<cstring>
#include<cmath>
using namespace std;
const int N=100005;
struct node
{
int l;
int r;
int times;
}allNode[3*N];
void build(int l,int r,int n)
{
if(l==r)
{
allNode[n].l=l;
allNode[n].r=r;
allNode[n].times=0;
}
else
{
int mid=(l+r)>>1;
allNode[n].l=l;
allNode[n].r=r;
build(l,mid,2*n);
build(mid+1,r,2*n+1);
allNode[n].times=0;
}
}
void print(int n)
{
printf("node:%d left:%d right:%d\n",n,allNode[n].l,allNode[n].r);
if(allNode[n].r-allNode[n].l>0)
{
print(2*n);
print(2*n+1);
}
}
void insert(int l,int r,int n,int val)
{
if((allNode[n].l==l)&&(allNode[n].r==r))
{
allNode[n].times+=val;
}
else
{
int mid=(allNode[n].l+allNode[n].r)>>1;
if(r<=mid)
insert(l,r,2*n,val);
else if(l>mid)
insert(l,r,2*n+1,val);
else
{
insert(l,mid,2*n,val);
insert(mid+1,r,2*n+1,val);
}
}
}
int query(int l,int r,int n)
{
if((allNode[n].l==l)&&(allNode[n].r==r)) return allNode[n].times;
else
{
insert(allNode[2*n].l,allNode[2*n].r,2*n,allNode[n].times);
insert(allNode[2*n+1].l,allNode[2*n+1].r,2*n+1,allNode[n].times);
allNode[n].times=0;
int mid=(allNode[n].l+allNode[n].r)>>1;
if(r<=mid)
return query(l,r,2*n);
else if(l>mid)
return query(l,r,2*n+1);
else
{
return (query(l,mid,2*n)+query(mid+1,r,2*n+1));
}
}
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
if(n==0) break;
build(1,n,1);
//print(1);
for(int j=1;j<=n;j++)
{
int a,b;
scanf("%d%d",&a,&b);
insert(a,b,1,1);
}
for(int i=1;i<n;i++)
printf("%d ",query(i,i,1));
printf("%d\n",query(n,n,1));
}
}