Astronomers often examine star maps where stars
are represented by points on a plane and each star has Cartesian coordinates.
Let the level of a star be an amount of the stars that are not higher and not to
the right of the given star. Astronomers want to know the distribution of the
levels of the stars.

For
example, look at the map shown on the figure above. Level of the star number 5
is equal to 3 (it‘s formed by three stars with a numbers 1, 2 and 4). And the
levels of the stars numbered by 2 and 4 are 1. At this map there are only one
star of the level 0, two stars of the level 1, one star of the level 2, and one
star of the level 3.
You are to write a program that will count the
amounts of the stars of each level on a given map.
The first line of the input file contains a number
of stars N (1<=N<=15000). The following N lines describe coordinates of
stars (two integers X and Y per line separated by a space, 0<=X,Y<=32000).
There can be only one star at one point of the plane. Stars are listed in
ascending order of Y coordinate. Stars with equal Y coordinates are listed in
ascending order of X coordinate.
The output should contain N lines, one number per
line. The first line contains amount of stars of the level 0, the second does
amount of stars of the level 1 and so on, the last line contains amount of stars
of the level N-1.
This problem has huge input data,use scanf()
instead of cin to read data to avoid time limit exceed.
1 //Accepted 420K 172MS C++ 700B
2 /*
3
4 题意:
5 给出一些星星的位置,其中每颗星左下方(包括正左和正下)的数量为
6 该星星的级数,问每个级数的星星有几颗。
7
8 树状数组:
9 入门题。因为数据是由y轴递增的,因此只计算x轴的即可。
10 a[i]表示第i级的星星的个数,c[i]表示第1级到第i级的星星
11 个数之和。每次计算再更新,因为级数计算不包括本身。
12
13 */
14 #include<stdio.h>
15 #include<string.h>
16 #define N 35000
17 int a[N],c[N];
18 int lowbit(int i)
19 {
20 return i&(-i);
21 }
22 void insert(int k,int detal)
23 {
24 for(;k<=N;k+=lowbit(k))
25 c[k]+=detal;
26 }
27 int getsum(int k) //a[1]+..+a[k]
28 {
29 int t=0;
30 for(;k>0;k-=lowbit(k))
31 t+=c[k];
32 return t;
33 }
34 int main(void)
35 {
36 int n,x,y;
37 while(scanf("%d",&n)!=EOF)
38 {
39 memset(a,0,sizeof(a));
40 memset(c,0,sizeof(c));
41 for(int i=0;i<n;i++){
42 scanf("%d%d",&x,&y);
43 x++; //树状数组坐标由1开始
44 a[getsum(x)]++;
45 insert(x,1);
46 }
47 for(int i=0;i<n;i++) printf("%d\n",a[i]);
48 }
49 return 0;
50 }