1 /*
2 题意: 中文题
3
4 分析:就是区间覆盖,然后求最前连续长度为len的0串或01串的起始位置;
5 conl[rt][0]表示区间从左开始最长0串长度,
6 conr[rt][0]表示区间从右开始最长0串长度;
7 conl[rt][1]表示区间从左开始最长01串长度,
8 conr[rt][1]表示区间从右开始最长01串长度;
9 然后就是模拟;
10
11 */
12 #include<cstdio>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #include<cmath>
17 #include<cstdlib>
18 #include<queue>
19 #include<vector>
20 #define lson l,m,rt<<1
21 #define rson m+1,r,rt<<1|1
22 using namespace std;
23 const int N=100000+10;
24
25 int conl[N<<2][2],conr[N<<2][2],mx[N<<2][2],col[N<<2];
26 //0表示空,1表示DS+kong
27 void pushup(int l,int m,int r,int rt){
28 for (int i=0;i<2;i++){
29 if (conl[rt<<1][i]==m-l+1){
30 conl[rt][i]=conl[rt<<1][i]+conl[rt<<1|1][i];
31 }else conl[rt][i]=conl[rt<<1][i];
32 if (conr[rt<<1|1][i]==r-m){
33 conr[rt][i]=conr[rt<<1|1][i]+conr[rt<<1][i];
34 }else conr[rt][i]=conr[rt<<1|1][i];
35
36 int t=conr[rt<<1][i]+conl[rt<<1|1][i];
37 mx[rt][i]=max(t,max(mx[rt<<1][i],mx[rt<<1|1][i]));
38 }
39 }
40 void pushdown(int l,int m,int r,int rt){
41 if (col[rt]!=-1){
42 if (col[rt]==0){
43 conl[rt<<1][0]=conr[rt<<1][0]=mx[rt<<1][0]=m-l+1;
44 conl[rt<<1][1]=conr[rt<<1][1]=mx[rt<<1][1]=m-l+1;
45
46 conl[rt<<1|1][0]=conr[rt<<1|1][0]=mx[rt<<1|1][0]=r-m;
47 conl[rt<<1|1][1]=conr[rt<<1|1][1]=mx[rt<<1|1][1]=r-m;
48
49 }else if (col[rt]==1){
50 conl[rt<<1][0]=conr[rt<<1][0]=mx[rt<<1][0]=0;
51 conl[rt<<1][1]=conr[rt<<1][1]=mx[rt<<1][1]=m-l+1;
52
53 conl[rt<<1|1][0]=conr[rt<<1|1][0]=mx[rt<<1|1][0]=0;
54 conl[rt<<1|1][1]=conr[rt<<1|1][1]=mx[rt<<1|1][1]=r-m;
55
56 }else if (col[rt]==2){
57 conl[rt<<1][0]=conr[rt<<1][0]=mx[rt<<1][0]=0;
58 conl[rt<<1][1]=conr[rt<<1][1]=mx[rt<<1][1]=0;
59
60 conl[rt<<1|1][0]=conr[rt<<1|1][0]=mx[rt<<1|1][0]=0;
61 conl[rt<<1|1][1]=conr[rt<<1|1][1]=mx[rt<<1|1][1]=0;
62
63 }
64 col[rt<<1]=col[rt<<1|1]=col[rt];
65 col[rt]=-1;
66 }
67 }
68 void build(int l,int r,int rt){
69 mx[rt][0]=conl[rt][0]=conr[rt][0]=r-l+1;
70 mx[rt][1]=conl[rt][1]=conr[rt][1]=r-l+1;
71 col[rt]=-1;
72 if (l==r) return ;
73 int m=(l+r)>>1;
74 build(lson);
75 build(rson);
76 pushup(l,m,r,rt);
77 }
78 void update(int L,int R,int z,int l,int r,int rt){
79 if (L<=l && r<=R){
80 if (z==0){
81 conl[rt][0]=conr[rt][0]=mx[rt][0]=r-l+1;
82 conl[rt][1]=conr[rt][1]=mx[rt][1]=r-l+1;
83 }else if (z==1){
84 conl[rt][0]=conr[rt][0]=mx[rt][0]=0;
85 conl[rt][1]=conr[rt][1]=mx[rt][1]=r-l+1;
86
87 }else if (z==2){
88 conl[rt][0]=conr[rt][0]=mx[rt][0]=0;
89 conl[rt][1]=conr[rt][1]=mx[rt][1]=0;
90 }
91 col[rt]=z;
92 return;
93 }
94 int m=(l+r)>>1;
95 pushdown(l,m,r,rt);
96 if (L<=m) update(L,R,z,lson);
97 if (m< R) update(L,R,z,rson);
98 pushup(l,m,r,rt);
99 }
100 int query(int k,int len,int l,int r,int rt){
101 if (mx[rt][k]<len) return -1;
102 int m=(l+r)>>1;
103 pushdown(l,m,r,rt);
104 if (mx[rt<<1][k]>=len) return query(k,len,lson);
105 else if (conr[rt<<1][k]+conl[rt<<1|1][k]>=len) return m-conr[rt<<1][k]+1;
106 else if (mx[rt<<1|1][k]>=len) return query(k,len,rson);
107 }
108 int n,m;
109 int main(){
110 int T,cas=0;
111 char s[15];
112 int len;
113 scanf("%d",&T);
114 while (T--){
115 scanf("%d%d",&n,&m);
116 printf("Case %d:\n",++cas);
117 build(1,n,1);
118 for (int i=0;i<m;i++){
119 scanf("%s",s);
120 if (s[0]=='D'){
121 scanf("%d",&len);
122 int t=query(0,len,1,n,1);
123 if (t==-1){
124 printf("fly with yourself\n");
125 }else {
126 printf("%d,let's fly\n",t);
127 update(t,t+len-1,1,1,n,1);
128 }
129 }else if (s[0]=='N'){
130 scanf("%d",&len);
131 int t=query(0,len,1,n,1);
132 if (t==-1){
133 t=query(1,len,1,n,1);
134 if (t==-1) printf("wait for me\n");
135 else {
136 printf("%d,don't put my gezi\n",t);
137 update(t,t+len-1,2,1,n,1);
138 }
139 }else {
140 printf("%d,don't put my gezi\n",t);
141 update(t,t+len-1,2,1,n,1);
142 }
143
144 }else if (s[0]=='S'){
145 int x,y;
146 scanf("%d%d",&x,&y);
147 printf("I am the hope of chinese chengxuyuan!!\n");
148 update(x,y,0,1,n,1);
149 }
150
151 }
152 }
153 return 0;
154 }