题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
#include<cstdio>
using namespace std;
struct node
{
int start;
int end;
int num;
};
node q[500000];
void built(int s,int e,int key)
{
q[key].start=s;
q[key].end=e;
q[key].num=0;
if(s==e)
{
return;
}
int mid=(s+e)/2;
built(s,mid,2*key);
built(mid+1,e,2*key+1);
}
void updata(int i,int j,int key)
{
if(q[key].start==i&&q[key].end==j)
{
q[key].num++;
return;
}
int mid=(q[key].start+q[key].end)/2;
if(i<=mid&&j>mid)
{
updata(i,mid,2*key);
updata(mid+1,j,2*key+1);
}
else
{
if(i<=mid)
updata(i,j,2*key);
if(j>mid)
updata(i,j,2*key+1);
}
}
void insert(int i,int j,int key)
{
if(key!=1)
q[key].num+=q[key/2].num;
if(q[key].start==q[key].end)
{
return;
}
int mid=(q[key].start+q[key].end)/2;
if(i<=mid)
insert(i,j,2*key);
if(j>mid)
insert(i,j,2*key+1);
}
int check(int i,int key)
{
if(q[key].start==q[key].end)
return q[key].num;
int mid=(q[key].start+q[key].end)/2;
if(i<=mid)
check(i,2*key);
else
check(i,2*key+1);
}
int main()
{
int N,a,b,i;
while(scanf("%d",&N)&&N)
{
built(1,N,1);
for(i=1;i<=N;i++)
{
scanf("%d%d",&a,&b);
updata(a,b,1);
}
insert(1,N,1);
printf("%d",check(1,1));
for(i=2;i<=N;i++)
printf("% d",check(i,1));
printf("
");
}
return 0;
}