本题对于我而言,一开始不知道如何把树状数组建立在问题上,其实对于一个问题,经过一定的处理后,可以直接套用树状数组,只要满足其性质,可以通过树状数组的操作解决即可。
因为题目的数据是已经有顺序的,所以只要以star 的横坐标为数组的下标建立树状数组即可,同时因为x>=0,所以在操作前,x++。

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=15005;
const int M=32003;
int level[N],tree[M];//数组是以横坐标为下标
int n;
void update(int p,int c)
{
    while(p<=M)//此时数组的大小是变化的,因此用最大的
    {
        tree[p]+=c;
        p+=(p&-p);
    }
}
int query(int p)
{
    int sum=0;
    while(p)
    {
        sum+=tree[p];
        p-=(p&-p);
    }
    return sum;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int x,y;
        memset(level,0,sizeof(level));
        memset(tree,0,sizeof(tree));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);//树状数组从1开始,x++
            level[query(++x)]++;//先查询后修改,因为不包括自身
            update(x,1);
        }
        for(int i=0;i<=n-1;i++)
            printf("%d\n",level[i]);
    }
    return 0;
}