【题目】http://acm.hdu.edu.cn/showproblem.php?pid=4614
【大意】
【思路】
【代码】
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=50000+10;
struct node
{
int le,ri,sum;//1代表未插花,0代表已插花
int mid()
{
return (le+ri)>>1;
}
} tree[maxn<<2];
int change[maxn<<2];
void Build(int rt,int le,int ri)//建树
{
tree[rt].le=le,tree[rt].ri=ri;
if(le==ri)
{
tree[rt].sum=1;
return ;
}
int mid=tree[rt].mid();
Build(rt<<1,le,mid);
Build(rt<<1|1,mid+1,ri);
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void Pushdown(int rt)//lazy操作
{
change[rt<<1]=change[rt];
change[rt<<1|1]=change[rt];
tree[rt<<1].sum=change[rt]*(tree[rt<<1].ri-tree[rt<<1].le+1);
tree[rt<<1|1].sum=change[rt]*(tree[rt<<1|1].ri-tree[rt<<1|1].le+1);
change[rt]=-1;
}
void Update(int rt,int le,int ri,int num)//修改
{
if(le<=tree[rt].le&&tree[rt].ri<=ri)
{
change[rt]=num;
tree[rt].sum=num*(tree[rt].ri-tree[rt].le+1);
return ;
}
if(change[rt]!=-1)
Pushdown(rt);
int mid=tree[rt].mid();
if(le<=mid)
Update(rt<<1,le,ri,num);
if(ri>mid)
Update(rt<<1|1,le,ri,num);
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
int Query(int rt,int le,int ri)//查询
{
if(le<=tree[rt].le&&ri>=tree[rt].ri)
return tree[rt].sum;
if(change[rt]!=-1)
Pushdown(rt);
int mid=tree[rt].mid();
if(le>mid)
return Query(rt<<1|1,le,ri);
else if(ri<=mid)
return Query(rt<<1,le,ri);
else
return Query(rt<<1,le,mid)+Query(rt<<1|1,mid+1,ri);
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(change,-1,sizeof(change));
scanf("%d%d",&n,&m);
Build(1,1,n);
int op,x,y;
while(m--)
{
scanf("%d%d%d",&op,&x,&y);
if(op==1)
{
++x;
int l=x,r=n,st=-1,ed;
while(l<=r)
{
int mid=(l+r)>>1;
if(Query(1,x,mid)>=1)
{
st=mid;
r=mid-1;
}
else
l=mid+1;
}
if(st==-1)//一朵花也不能插
{
printf("Can not put any one.\n");
continue;
}
if(Query(1,st,n)<y)//不能插够y朵花
{
l=st,r=n;
while(l<=r)
{
int mid=(l+r)>>1;
if(Query(1,mid,n)>=1)
{
ed=mid;
l=mid+1;
}
else
r=mid-1;
}
}
else//能插够y朵花
{
l=st,r=n,ed=n;
while(l<=r)
{
int mid=(l+r)>>1;
if(Query(1,st,mid)>=y)
{
ed=mid;
r=mid-1;
}
else
l=mid+1;
}
}
printf("%d %d\n",st-1,ed-1);
Update(1,st,ed,0);
}
else
{
++x,++y;
printf("%d\n",y-x+1-Query(1,x,y));
Update(1,x,y,1);
}
}
puts("");
}
return 0;
}