hdu4553
/*
hdu4553
维护 两个线段树,分别是屌丝和女神,其他的都和hdu1540差不多吧
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
void pushdown(int num,int cnt);
int cas=1;
struct node
{
int le,ri,pre[2],suf[2],maxn[2],cover[2];
}tree[400005];
void build(int L,int R,int num)
{
tree[num].le=L;
tree[num].ri=R;
tree[num].pre[0]=tree[num].pre[1]=R-L+1;
tree[num].suf[0]=tree[num].suf[1]=R-L+1;
tree[num].maxn[0]=tree[num].maxn[1]=R-L+1;
tree[num].cover[1]=tree[num].cover[0]=-1;
if(L==R)
{
return;
}
int mid=(L+R)/2;
build(L,mid,num*2);
build(mid+1,R,num*2+1);
}
int ask(int num,int T,int cnt)
{
if(tree[num].le==tree[num].ri)return tree[num].le;
pushdown(num,cnt);
if(tree[num*2].maxn[cnt]>=T)
{
return ask(num*2,T,cnt);
}
if(tree[num*2].suf[cnt]+tree[num*2+1].pre[cnt]>=T)
{
return tree[num*2].ri-tree[num*2].suf[cnt]+1;
}
else
{
return ask(num*2+1,T,cnt);
}
}
void pushdown(int num,int cnt)
{
if(tree[num].cover[cnt]!=-1)
{
if(!tree[num].cover[cnt])
{
tree[num*2].cover[cnt]=tree[num*2+1].cover[cnt]=0;
tree[num*2].pre[cnt]=tree[num*2+1].pre[cnt]=0;
tree[num*2].suf[cnt]=tree[num*2+1].suf[cnt]=0;
tree[num*2].maxn[cnt]=tree[num*2+1].maxn[cnt]=0;
tree[num].cover[cnt]=-1;
}
else
{
tree[num*2].cover[cnt]=tree[num*2+1].cover[cnt]=tree[num].cover[cnt];
tree[num*2].suf[cnt]=tree[num*2].pre[cnt]=tree[num*2].maxn[cnt]=tree[num*2].ri-tree[num*2].le+1;
tree[num*2+1].suf[cnt]=tree[num*2+1].pre[cnt]=tree[num*2+1].maxn[cnt]=tree[num*2+1].ri-tree[num*2+1].le+1;
tree[num].cover[cnt]=-1;
}
}
}
void pushup(int num,int cnt)
{
tree[num].maxn[cnt]=max(tree[num*2].maxn[cnt],tree[num*2+1].maxn[cnt]);
tree[num].maxn[cnt]=max(tree[num].maxn[cnt],tree[num*2].suf[cnt]+tree[num*2+1].pre[cnt]);
tree[num].pre[cnt]=tree[num*2].pre[cnt];
tree[num].suf[cnt]=tree[num*2+1].suf[cnt];
if(tree[num*2].pre[cnt]==tree[num*2].ri-tree[num*2].le+1)
tree[num].pre[cnt]+=tree[num*2+1].pre[cnt];
if(tree[num*2+1].suf[cnt]==tree[num*2+1].ri-tree[num*2+1].le+1)
tree[num].suf[cnt]+=tree[num*2].suf[cnt];
}
void update(int L,int R,int num,int cnt,int c)
{
if(L<=tree[num].le&&R>=tree[num].ri)
{
if(c==0)
{
tree[num].cover[cnt]=0;
tree[num].pre[cnt]=0;
tree[num].suf[cnt]=0;
tree[num].maxn[cnt]=0;
}
else
{
tree[num].pre[cnt]=tree[num].ri-tree[num].le+1;
tree[num].suf[cnt]=tree[num].ri-tree[num].le+1;
tree[num].maxn[cnt]=tree[num].ri-tree[num].le+1;
tree[num].cover[cnt]=c;
}
return;
}
pushdown(num,cnt);
int mid=(tree[num].le+tree[num].ri)/2;
if(L<=mid)update(L,R,num*2,cnt,c);
if(R>mid)update(L,R,num*2+1,cnt,c);
pushup(num,cnt);
}
int main()
{
// std::ios::sync_with_stdio(false);
int t,n,m,i,T,R;
char ss[10];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
printf("Case %d:\n",cas++);
build(1,n,1);
for(i=0;i<m;i++)
{//cout<<i<<endl;
scanf("%s %d",ss,&T);
if(ss[0]=='D')
{
if(tree[1].maxn[0]>=T)
{
int temp=ask(1,T,0);
printf("%d,let's fly\n",temp);
update(temp,temp+T-1,1,0,0);
// cout<<"qqqqqqqq"<<endl;
}
else printf("fly with yourself\n");
}
else if(ss[0]=='N')
{
if(tree[1].maxn[0]>=T)
{
int temp=ask(1,T,0);
printf("%d,don't put my gezi\n",temp);
update(temp,temp+T-1,1,0,0);
update(temp,temp+T-1,1,1,0);
}
else if(tree[1].maxn[1]>=T)
{
int temp=ask(1,T,1);
printf("%d,don't put my gezi\n",temp);
update(temp,temp+T-1,1,0,0);
update(temp,temp+T-1,1,1,0);
}
else
printf("wait for me\n");
}
else
{
scanf("%d",&R);
printf("I am the hope of chinese chengxuyuan!!\n");
update(T,R,1,0,1);
update(T,R,1,1,1);
}
}
}
return 0;
}