HDU 4614 Vases and Flowers(サブルック+線分ツリー区間更新)


アイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイアイower in it,the the the the the the she will tre will put in the vase A+1、A+2、…、N-1、until there isのflower lefr r she the vase N-1.The left flowers will will be discarded.Of course、someclclclclclcleesssssssclclclclclclclclclclclclclclclclclclclclclclclclclclclamamamamamamamamamshshshshshshshshshshshshshshshshshshshshshshshshshshshshe e e e e e e e e e e e e e e e e e e e e e e eベルドfrom A to B(A<=B).The flowers in the cleaned vases will be discarded.
Input The first line contains an integer T,indicating the number of test cases. 
For each test case,the first line contains two integers N(1<N>50001)and M(1<M<50001).N is the number of vases,and M is the operation s of Alice.Each of the next M lineas M lines containtements.The firse 1.interst.then two integers A and F followw.It means Alice receive F flowers and try to put a flower in the varst.If K is 2,then twotegers A and B followowower.It means the owner would like to cleambers the varsoutput the position of the vase in which Alice put the first flower and last one、separated by a blank.If she can not put any one、then output'Can not put put any one.'.For each operation of which K.put 2 
   
Output one blank line after each test case.Sample Input
2
10 5
1 3 5
2 4 5
1 1 8
2 3 6
1 8 8
10 6
1 2 5
2 3 4
1 0 8
2 2 5
1 4 4
1 2 3
Sample Output
3 7
2
1 9
4
Can not put any one.

2 6
2
0 9
4
4 5
2 3

クイズ:
nつの花瓶があります.最初は全部空いています.そしてm回操作します.最初に入力したのが1なら、二つの数x、yを入力して、x、y区間に生け花を入れます.花があれば、後ろに回します.終わった条件は最後まで差し込むか、挿し込むだけです.もし一つも挿入できないなら、悪口を言います.
この考え方は普通のlazyです.
コード:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct node
{
    int l,r;
    int tag;//   -1      ,   0           , 1    
    int v;//          
}t[50005*4];
int n;
void Build(int l,int r,int k)
{
    t[k].l=l;
    t[k].r=r;
    t[k].v=0;
    t[k].tag=-1;
    if(l==r)
        return;
    int mid=(l+r)/2;
    Build(l,mid,k*2);
    Build(mid+1,r,k*2+1);
}
void pushdown(int k)//      
{
    t[k*2].tag=t[k*2+1].tag=t[k].tag;
    t[k*2].v=t[k].tag*(t[k*2].r-t[k*2].l+1);
    t[k*2+1].v=t[k].tag*(t[k*2+1].r-t[k*2+1].l+1);
    t[k].tag=-1;
}
void update(int l,int r,int v,int k)
{
    if(t[k].l==l&&t[k].r==r)
    {
        t[k].tag=v;
        t[k].v=v*(r-l+1);//      
        return;
    }
    if(t[k].tag!=-1)//     
        pushdown(k);
    int mid=(t[k].l+t[k].r)/2;
    if(r<=mid)
        update(l,r,v,k*2);
    else if(l>mid)
        update(l,r,v,k*2+1);
    else
    {
        update(l,mid,v,k*2);
        update(mid+1,r,v,k*2+1);
    }
    t[k].v=t[k*2].v+t[k*2+1].v;//        
}
int query(int l,int r,int k)//          
{
    if(t[k].l==l&&t[k].r==r)
    {
        return t[k].v;
    }
    if(t[k].tag!=-1)//  lazy tag
        pushdown(k);
    int mid=(t[k].l+t[k].r)/2;
    if(r<=mid)
        return query(l,r,k*2);
    else if(l>mid)
        return query(l,r,k*2+1);
    else
    {
        return query(l,mid,k*2)+query(mid+1,r,k*2+1);
    }
    t[k].v=t[k*2].v+t[k*2+1].v;
}
int dive(int s,int num)//    ,         ,           
{
    int temp=query(s,n,1);
    if(temp==n-s+1)//        
        return -1;
    if(n-s+1-temp=l)//  
    {
        mid=(l+r)/2;
        d=mid-s+1-query(s,mid,1);//d  s mid     
        if(d>num)
        {
            r=mid-1;
        }
        else if(d