#include <iostream>
#include <string>
using namespace std;
const int MAXN = 72010;
struct node
{
int l;
int r;
int count;
}nodes[MAXN];
void build(int l, int r, int step)
{
nodes[step].l = l;
nodes[step].r = r;
int mid;
if((r - l) > 1)
{
mid = (r + l) / 2;
build(l, mid, step * 2);
build(mid, r, step * 2 + 1);
}
};
void insert(int l, int r, int step)
{
nodes[step].count++;
int l0 = nodes[step].l;
int r0 = nodes[step].r;
if(l0 == l && r0 == r)
return;
int mid = (l0 + r0) / 2;
if(mid <= l)
insert(l, r, step * 2 + 1);
else if(mid >= r)
insert(l, r, step * 2);
else
insert(mid, r, step * 2 + 1);
};
int query(int l, int r, int step)
{
int l0 = nodes[step].l;
int r0 = nodes[step].r;
if(l == l0 && r == r0)
return nodes[step].count;
int mid = (l0 + r0) / 2;
if(mid <= l)
return query(l, r, step * 2 + 1);
else if(mid >= r)
return query(l, r, step * 2);
else
return query(l, mid, step * 2) + query(mid, r, step * 2 + 1);
};
int ans[15004];
int main()
{
int cnt;
int x, y;
cin >> cnt;
for(int i = 0; i < cnt; i++)
{
ans[i] = 0;
}
build(0, 32000, 1);
int t_cnt = cnt;
while(t_cnt--)
{
cin >> x >> y;
ans[query(0, x, 1)]++;
insert(0, x, 1);
}
for(int i = 0; i < cnt; i++)
cout << ans[i] << endl;
return 0;
}
POJ2352 Interval Tree, Segment Tree, 线段树, 区间树
最新推荐文章于 2018-01-26 16:26:00 发布