输入顺序是有规律的,只需要x的值就可以建树了,同时,边建树边查找
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=32010;
int tree[4*maxn];
int x[maxn];
int level[15010];
void build(int p,int l,int r,int x)
{
if(l==r) {tree[p]++;return ;}
int mid=(l+r)/2;
if(x>mid) build(2*p+1,mid+1,r,x);
else build(2*p,l,mid,x);
tree[p]=tree[2*p+1]+tree[2*p];
}
int find_(int p,int l,int r,int x,int y)
{
if(l==x&&r==y) return tree[p];
int mid=(l+r)/2;
if(mid>=y) return find_(2*p,l,mid,x,y);
else if(mid<=x) return find_(2*p+1,mid,r,x,y);
else return find_(2*p,l,mid,x,mid)+find_(2*p+1,mid+1,r,mid+1,y);
}
int main()
{
int n;cin>>n;
int max_x=-1;
for(int i=0;i<n;i++)
{
int y;
scanf("%d%d",&x[i],&y);
if(max_x<x[i]) max_x=x[i];
}
for(int i=0;i<n;i++)
{
build(1,0,max_x,x[i]);
level[find_(1,0,max_x,0,x[i])-1]++;
}
for(int i=0;i<n;i++)
printf("%d\n",level[i]);
return 0;
}