http://acm.hdu.edu.cn/showproblem.php?pid=4614

#include <cstdio>
#include <cstring>
#define N 60005
struct st
{
    int x,y,sum,flag;
}p[N * 4];
void build(int r,int x,int y)
{
    p[r].x = x;
    p[r].y = y;
    p[r].sum = 0;
    p[r].flag = 0;
    if(x == y) return ;
    int mid = (x + y) >> 1,tem = r  << 1;
    build(tem,x,mid);
    build(tem + 1,mid + 1,y);
}
int query(int r,int x,int y,int val)
{
    int sum = 0;
    if(p[r].x == x && p[r].y == y)
    {
        if(val == 0)
        return(y - x + 1 -  p[r].sum);
        else
        {
            int sum1;
            sum1 = p[r].sum;
            p[r].flag = 1;
            p[r].sum = 0;
            return sum1;
        }
    }
    int mid = (p[r].x + p[r].y) >> 1,tem = r << 1;
    if(p[r].flag == 1)
    {
        p[tem].sum = 0;
        p[tem].flag = 1;
        p[tem + 1].sum = 0;
        p[tem + 1].flag = 1;
        p[r].flag = 0;
    }
    else if(p[r].flag == -1)
    {
        p[tem].sum = (p[tem].y - p[tem].x + 1);
        p[tem].flag = -1;
        p[tem + 1].sum = (p[tem + 1].y - p[tem + 1].x + 1);
        p[tem + 1].flag = -1;
        p[r].flag = 0;
    }
    if(y <= mid)
        sum =  query(tem,x,y,val);
    else if(x > mid)
        sum =  query(tem + 1,x,y,val);
    else
        sum =  query(tem,x,mid,val) + query(tem + 1,mid + 1,y,val);
    p[r].sum = p[tem].sum + p[tem + 1].sum;
    return sum;

}
void insert(int r,int x,int y)
{
    if(p[r].x == x && p[r].y == y)
    {
        p[r].sum = y - x + 1;
        p[r].flag = -1;
        return ;
    }
    int mid = (p[r].x +p[r]. y) >> 1,tem = r << 1;
    if(p[r].flag == 1)
    {
        p[tem].sum = 0;
        p[tem].flag = 1;
        p[tem + 1].sum = 0;
        p[tem + 1].flag = 1;
        p[r].flag = 0;
    }
    else if(p[r].flag == -1)
    {
        p[tem].sum = (p[tem].y - p[tem].x + 1);
        p[tem].flag = -1;
        p[tem + 1].sum = (p[tem + 1].y - p[tem + 1].x + 1);
        p[tem + 1].flag = -1;
        p[r].flag = 0;
    }
    if(y <= mid)
        insert(tem,x,y);
    else if(x > mid)
        insert(tem + 1,x,y);
    else
    {
        insert(tem,x,mid);
        insert(tem + 1,mid + 1,y);
    }
    p[r].sum = p[tem].sum + p[tem + 1].sum;

}
int main()
{
    int T;
    scanf("%d",&T);
   // printf("[pre]");
    while(T --)
    {
        int n,m,a,b,k;
        scanf("%d %d",&n,&m);
        build(1,1,n);

    while(m --)
        {
             scanf("%d %d %d",&k,&a,&b);
             a = a + 1;
            if(k == 1)
            {
                int start = a,end = n,mid,uu = -1,st,en,ss;
                while(start <= end)
                {
                    mid = (start + end) >> 1;
                    if(query(1,a,mid,0) > 0)
                    {
                        uu = mid;
                        end = mid - 1;
                    }
                    else
                        start = mid + 1;
                }
                if(uu == -1) {printf("Can not put any one.\n");continue;}
                st = uu;
                start = uu;end = n;
                if(query(1,uu,n,0) <= b)
                {
                    //printf("%d\n",query(1,uu,n,0));
                    while(start <= end)
                    {
                        mid = (start + end) >> 1;
                        if(query(1,mid,n,0) > 0)
                        {
                            en = mid;
                            start = mid + 1;
                        }
                        else
                            end = mid - 1;

                    }
                }
                else
                {
                    ss = uu;
                    while(start <= end)
                    {
                        mid = (start + end) >> 1;
                        int count = query(1,ss,mid,0);
                        if(count == b)
                        {
                            en = mid;
                            end = mid - 1;
                        }
                        else if(count < b) start = mid + 1;
                        else end = mid - 1;

                    }
                }
                insert(1,st,en);
                printf("%d %d\n",st - 1,en - 1);
            }
            else
            printf("%d\n",query(1,a,b + 1,1));
        }
        printf("\n");
    }
   // printf("[/pre]\n");
    return 0;
}

 

posted @ 2013-07-31 09:20  fly_lovelove  阅读(169)  评论(0编辑  收藏  举报