线段树
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 32010
using namespace std;
struct tree{
int l,r;
int sum;
}a[4*N];
void build(int l,int r,int k){
a[k].l=l;a[k].r=r;a[k].sum=0;
if(l==r){
return;
}
int mid=(a[k].l+a[k].r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
}
int query(int l,int r,int k){
int as=0;
if(a[k].l==l&&a[k].r==r){
return a[k].sum;
}
else{
int mid=(a[k].l+a[k].r)>>1;
if(l>mid){
as+=(query(l,r,k<<1|1));
}
else if(r<=mid){
as+=(query(l,r,k<<1));
}
else
as+=(query(l,mid,k<<1)+query(mid+1,r,k<<1|1));
return as;
}
}
void ins(int x,int k){
a[k].sum++;
if(a[k].l==a[k].r&&a[k].r==x){
return;
}
int mid=(a[k].l+a[k].r)>>1;
if(x<=mid)
ins(x,k<<1);
else
ins(x,k<<1|1);
}
int main()
{
int n;
while(~scanf("%d",&n)){
build(0,N,1);
int x,y,ans[15010];
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;++i){
scanf("%d%d",&x,&y);
ans[query(0,x,1)]++;
ins(x,1);
}
for(int i=0;i<n;++i)
printf("%d\n",ans[i]);
}
return 0;
}