线段树,顺序存储实现
#include <stdio.h>
#include <string.h>
const int maxx=32000;
const int maxn=15000;
int l[3*(maxx+1)],h[3*(maxx+1)],w[3*(maxx+1)];
int N;
int ans[maxn];
void Create(int t,int s,int f)
{
l[t]=s;h[t]=f;
if(s<f)
{
int mid=(s+f)/2;
Create(2*t+1,s,mid);
Create(2*t+2,mid+1,f);
}
}
void Init(int t)
{
w[t]=0;
if(l[t]<h[t])
{
Init(2*t+1);
Init(2*t+2);
}
}
int GetAmount(int t,int f )
{
if(h[t]==f) return w[t];
else
{
int mid=(l[t]+h[t])/2;
if(mid>=f)
return GetAmount(2*t+1,f);
else
return w[2*t+1]+GetAmount(2*t+2,f);
}
}
void Insert(int t,int x)
{
if(l[t]<=x&&x<=h[t])
{
w[t]++;
if(l[t]!=h[t])
{
int mid=(l[t]+h[t])/2;
Insert(2*t+1,x);
Insert(2*t+2,x);
}
}
}
int main()
{
Create(0,0,maxx);
while(scanf("%d",&N)!=EOF)
{
Init(0);
memset(ans,0,sizeof(ans));
int i,x,y,level;
for(i=0;i<N;i++)
{
scanf("%d%d",&x,&y);
level=GetAmount(0,x);
ans[level]++;
Insert(0,x);
}
for(i=0;i<N;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}