hdu1556

/*
ID:billat11
LANG:C
TASK:namenum
*/
#include<iostream>
#include<cstdio>
#include<cstdarg>
#include<stdlib.h>
#include<cstring>
#include<cmath>
using namespace std;
const int N=100005;
struct node
{
    int l;
    int r;
    int times;
}allNode[3*N];
void build(int l,int r,int n)
{
    if(l==r)
    {
        allNode[n].l=l;
        allNode[n].r=r;
        allNode[n].times=0;
    }
    else
    {
        int mid=(l+r)>>1;
        allNode[n].l=l;
        allNode[n].r=r;
        build(l,mid,2*n);
        build(mid+1,r,2*n+1);
        allNode[n].times=0;
    }
}
void print(int n)
{
    printf("node:%d left:%d right:%d\n",n,allNode[n].l,allNode[n].r);
    if(allNode[n].r-allNode[n].l>0)
    {
        print(2*n);
        print(2*n+1);
    }
}
void insert(int l,int r,int n,int val)
{
    if((allNode[n].l==l)&&(allNode[n].r==r)) 
    {
        allNode[n].times+=val;
    }
    else
    {
        int mid=(allNode[n].l+allNode[n].r)>>1;
        if(r<=mid)
            insert(l,r,2*n,val);
        else if(l>mid)
            insert(l,r,2*n+1,val);
        else
        {
            insert(l,mid,2*n,val);
            insert(mid+1,r,2*n+1,val);
        }
    }
}
int query(int l,int r,int n)
{
    if((allNode[n].l==l)&&(allNode[n].r==r)) return allNode[n].times;
    else
    {
        insert(allNode[2*n].l,allNode[2*n].r,2*n,allNode[n].times);
        insert(allNode[2*n+1].l,allNode[2*n+1].r,2*n+1,allNode[n].times);
        allNode[n].times=0;
        int mid=(allNode[n].l+allNode[n].r)>>1;
        if(r<=mid)
            return query(l,r,2*n);
        else if(l>mid)
            return query(l,r,2*n+1);
            else
            {
                return (query(l,mid,2*n)+query(mid+1,r,2*n+1));
            }
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        if(n==0) break;
        
        build(1,n,1);
        //print(1);
        
        for(int j=1;j<=n;j++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            insert(a,b,1,1);
        }
        for(int i=1;i<n;i++)
            printf("%d ",query(i,i,1));
            printf("%d\n",query(n,n,1));
             
    }
}

  

posted @ 2012-06-15 20:35  wuzhibin  阅读(448)  评论(0)    收藏  举报