原題地址
Color the ball
當N = 0,輸入結束。
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int left;
int right;
int data;
}tree[300000];
void bTree(int root,int l,int r)//建樹
{
tree[root].left=l;
tree[root].right=r;
tree[root].data=0;
int mid=(l+r)/2;
if(tree[root].left==tree[root].right)
{
return;
}
bTree(root*2,l,mid);
bTree(root*2+1,mid+1,r);
}
void uTree(int root,int l,int r)//更新樹
{
if(tree[root].left==l&&tree[root].right==r)//更新區間的值而不更新單點和子區間的值。最後再累加
{
tree[root].data+=1;
return;
}
int mid=(tree[root].left+tree[root].right)/2;
if(r<=mid)
{
uTree(root*2,l,r);
}
else if(l>mid)
{
uTree(root*2+1,l,r);
}
else
{
uTree(root*2,l,mid);
uTree(root*2+1,mid+1,r);
}
}
int sum[100011];
void sTree(int root)//遍歷樹,如果一個點在該區間內,加上該區間的權值。
{
for(int i=tree[root].left;i<=tree[root].right;i++)
{
sum[i]+=tree[root].data;
}
if(tree[root].left==tree[root].right)
{
return;
}
sTree(root*2);
sTree(root*2+1);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
//printf("%d\n",n);
if(n==0) break;
memset(sum,0,sizeof(sum));
bTree(1,1,n);
int t=n;
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
uTree(1,a,b);
}
sTree(1);
for(int i=1;i<n;i++)
{
printf("%d ",sum[i]);
}
printf("%d\n",sum[n]);
}
return 0;
}