/*
用线段树水的,初始化落了e[c].l=e[c].r=a,无限循环了
题意:求等级为1~n的个数,每个点的等级就是左下矩形范围内的星星数
*/
#include <stdio.h>
#include <string.h>
int n,m,f[15001],x[15001],y[15001];
struct node{
int l,r;
int w;
}e[15000*6];
void build(int a,int b,int c)
{
if(a==b)
{
e[c].l=a;
e[c].r=b;
e[c].w=0;
return;
}
e[c].l=a;
e[c].r=b;
e[c].w=0;
int mid=(a+b)/2;
build(a,mid,2*c);
build(mid+1,b,2*c+1);
}
void add(int a,int c)
{
if(e[c].l==a&&e[c].r==a)
{
e[c].w++;
return;
}
e[c].w++;
int mid=(e[c].l+e[c].r)/2;
if(a>mid)
add(a,2*c+1);
else
add(a,2*c);
}
int query(int a,int b,int c)
{
//printf("1\n");
if(a==e[c].l&&b==e[c].r)
return e[c].w;
int mid=(e[c].l+e[c].r)/2;
if(a>mid)
return query(a,b,2*c+1);
else if(b<=mid)
return query(a,b,2*c);
else
return query(a,mid,2*c)+query(mid+1,b,2*c+1);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,min=32001,max=-1;
for(i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(x[i]<min)
min=x[i];
if(x[i]>max)
max=x[i];
}
build(min,max,1);
memset(f,0,sizeof(f));
for(i=0;i<n;i++)
{
f[query(min,x[i],1)]++;
add(x[i],1);
}
for(i=0;i<n;i++)
printf("%d\n",f[i]);
}
return 0;
}
/*
树状数组
*/
#include <stdio.h>
#include <string.h>
#define lowbit(x) x&(-x)
int c[32001],f[15001];
void add(int x)
{
while(x<=32005)
{
c[x]++;
x+=lowbit(x);
}
}
int query(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
int i,x,y;
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;
f[query(x)]++;
add(x);
}
for(i=0;i<n;i++)
printf("%d\n",f[i]);
}
return 0;
}