#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define eb emplace_back
#define lb(x) (x&-x);
const int maxn=200010;
const int mo=1000000007;
const int inf=0x3f3f3f3f3f3f3f3f;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
return ;
}
int n,hm,hr,hc,hx,hy,m;
int tot,ice[18][18][22],freeze[18][18],vis[18][18][22],mh,block,door,wall,corner,rd,cd,hd,cr,cc;
char s[50];
int dx[9]={-1,-1,0,1,1,1,0,-1};
int dy[9]={0,-1,-1,-1,0,1,1,1};
int dr[6]={1,-1,0,0,0,0};
int dc[6]={0,0,1,-1,0,0};
int dh[6]={0,0,0,0,1,-1};
void ICE_BARRAGE(int r=0,int c=0,int d=0,int s=0){
r=read();
c=read();
d=read();
s=read();
int dis=0,cnt=0;
while(dis<=s){
if(r<0||r>=n||c<0||c>=n||ice[r][c][0])
break;
if(freeze[r][c]!=4){
freeze[r][c]++;
cnt++;
}
r=r+dx[d];
c=c+dy[d];
dis++;
}
printf("CIRNO FREEZED %lld BLOCK(S)\n",cnt);
return ;
}
void MAKE_ICE_BLOCK(){
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(freeze[i][j]==4){
cnt++;
freeze[i][j]=0;
}
}
}
tot+=cnt;
printf("CIRNO MADE %lld ICE BLOCK(S),NOW SHE HAS %lld ICE BLOCK(S)\n",cnt,tot);
return ;
}
bool out(int r,int c,int h){
return r<0||r>=n||c<0||c>=n||h<0||h>hm;
}
bool check(int r,int c,int h){
if(ice[r][c][h])
return 0;
if(h==0)
return 1;
for(int i=0;i<6;i++){
int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
if(out(nr,nc,nh))
continue;
if(ice[nr][nc][nh])
return 1;
}
return 0;
}
void PUT_ICE_BLOCK(int r=0,int c=0,int h=0){
r=read();
c=read();
h=read();
if(tot==0){
printf("CIRNO HAS NO ICE_BLOCK\n");
return ;
}
if(!check(r,c,h)){
printf("BAKA CIRNO,CAN'T PUT HERE\n");
return ;
}
tot--;
ice[r][c][h]=1;
if(h==0)
freeze[r][c]=0;
if(r<hr||r>hr+hx-1||c<hc||c>hc+hy-1)
printf("CIRNO MISSED THE PLACE\n");
else if(r>=hr+1&&r<=hr+hx-2&&c>=hc+1&&c<=hc+hy-2)
printf("CIRNO PUT AN ICE_BLOCK INSIDE THE HOUSE\n");
else
printf("CIRNO SUCCESSFULLY PUT AN ICE_BLOCK,NOW SHE HAS %lld ICE_BLOCK(S)\n",tot);
return ;
}
bool findearth(int r,int c,int h){
if(h==0)
return 1;
vis[r][c][h]=1;
int cnt=0;
for(int i=0;i<6;i++){
int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
if(out(nr,nc,nh)||!ice[nr][nc][nh]||vis[nr][nc][nh])
continue;
int ccc=findearth(nr,nc,nh);
if(ccc)
return 1;
}
return 0;
}
int erase(int r,int c,int h){
ice[r][c][h]=0;
int cnt=1;
for(int i=0;i<6;i++){
int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
if(out(nr,nc,nh)||!ice[nr][nc][nh])
continue;
cnt+=erase(nr,nc,nh);
}
return cnt;
}
void REMOVE_ICE_BLOCK(int r=0,int c=0,int h=0){
r=read();
c=read();
h=read();
if(!ice[r][c][h]){
printf("BAKA CIRNO,THERE IS NO ICE_BLOCK\n");
return ;
}
tot++;
ice[r][c][h]=0;
int cnt=0;
for(int i=0;i<6;i++){
int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
if(out(nr,nc,nh)||!ice[nr][nc][nh])
continue;
memset(vis,0,sizeof(vis));
if(!findearth(nr,nc,nh))
cnt+=erase(nr,nc,nh);
}
if(!cnt)
printf("CIRNO REMOVED AN ICE_BLOCK\n");
else
printf("CIRNO REMOVED AN ICE_BLOCK,AND %lld BLOCK(S) ARE BROKEN\n",cnt);
return ;
}
int pd(int r,int c,int h){
if(r>hr&&r<hr+hx-1&&c>hc&&c<hc+hy-1&&h<mh)
return 1;
else if(r>=hr&&r<=hr+hx-1&&c>=hc&&c<=hc+hy-1&&h<=mh)
return 2;
return 3;
}
int onco(int r,int c){
if((r==hr&&c==hc)||(r==hr&&c==hc+hy-1)||(r==hr+hx-1&&c==hc)||(r==hr+hx-1&&c==hc+hy-1))
return 1;
return 0;
}
bool getcor(int r,int c){
if(r==hr+1){
cr=hr;
cc=c;
return 1;
}
else if(r==hr+hx-2){
cr=hr+hx-1;
cc=c;
return 1;
}
else if(c==hc+1){
cr=r;
cc=hc;
return 1;
}
else if(c==hc+hy-2){
cr=r;
cc=hc+hy-1;
return 1;
}
return 0;
}
void MAKE_ROOF(){
int cnt=0;
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
int pos=pd(i,j,-1);
if(pos!=2)
continue;
for(int k=0;k<hm;k++)
if(ice[i][j][k])
mh=max(mh,k+1);
}
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
if(ice[i][j][mh])
cnt++;
ice[i][j][mh]=1;
}
if(tot+cnt<hx*hy){
printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCK(S) TO MAKE ROOF\n");
return ;
}
tot-=hx*hy-cnt;
if(mh<2||(hx-2)*(hy-2)*mh<2){
printf("SORRY CIRNO,HOUSE IS TOO SMALL\n");
return ;
}
int k1=0,k2=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<hm;k++){
if(!ice[i][j][k])
continue;
int pos=pd(i,j,k);
if(pos==2)
continue;
if(pos==1)
k1++;
else if(pos==3)
k2++;
ice[i][j][k]=0;
}
}
}
printf("%lld ICE_BLOCK(S) INSIDE THE HOUSE NEED TO BE REMOVED\n",k1);
printf("%lld ICE_BLOCK(S) OUTSIDE THE HOUSE NEED TO BE REMOVED\n",k2);
if(k1||k2)
block=1;
tot+=k1+k2;
cnt=findearth(hr,hc,mh);
if(!cnt){
printf("SORRY CIRNO,HOUSE IS BROKEN WHEN REMOVING BLOCKS\n");
return ;
}
cnt=0;
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
for(int k=1;k<=mh-2;k++){
int pos=pd(i,j,k);
if(pos!=2)
continue;
if(!ice[i][j][k])
continue;
memset(vis,0,sizeof(vis));
if(!findearth(i,j,k))
cnt+=erase(i,j,k);
}
}
tot+=cnt;
cnt=inf;
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
int pos=pd(i,j,0);
if(pos!=2)
continue;
if(ice[i][j][0]||ice[i][j][1]||onco(i,j))
continue;
if((i==((hr+hr+hx-1)/2))||(j==((hc+hc+hy-1)/2))||(((hx&1)==0)&&(i==((hr+hr+hx-1)/2+1)))||(((hy&1)==0)&&(j==((hc+hc+hy-1)/2+1)))){
door=5;
rd=i;
cd=j;
}
else if(door<5)
if(!getcor(i,j)){
door=4;
rd=i;
cd=j;
}
else if(door<4){
door=3;
int kkk=(ice[cr][cc][0]==1?0:1)+(ice[cr][cc][1]==1?0:1);
if(cnt>kkk){
cnt=kkk;
rd=i;
cd=j;
}
}
}
if(door==3&&cnt){
getcor(rd,cd);
wall=1;
ice[cr][cc][0]=ice[cr][cc][1]=1;
tot-=cnt;
if(tot<0){
printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCKS TO FIX THE WALL\n");
return ;
}
}
if(door==0){
cnt=inf;
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
int pos=pd(i,j,0);
if(pos!=2||onco(i,j)||(ice[i][j][0]&&ice[i][j][1]))
continue;
if(!getcor(i,j)){
door=2;
rd=i;
cd=j;
}
else if(door<2){
door=1;
int hh=(ice[i][j][1]==0?1:0);
int kkk=(ice[cr][cc][hh]==1?0:1);
if(cnt>kkk){
cnt=kkk;
rd=i;
cd=j;
hd=hh;
}
}
}
ice[rd][cd][0]=ice[rd][cd][1]=0;
tot++;
if(door==1&&cnt){
getcor(rd,cd);
ice[cr][cc][hd]=1;
wall=1;
tot-=cnt;
if(tot<0){
printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCKS TO FIX THE WALL\n");
return ;
}
}
}
cnt=0;
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
if(onco(i,j))
continue;
for(int k=0;k<mh;k++){
int pos=pd(i,j,k);
if(pos!=2||ice[i][j][k]||((i==rd)&&(j==cd)&&(k<=1)))
continue;
wall=1;
ice[i][j][k]=1;
cnt++;
}
}
if(cnt>tot){
printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCKS TO FIX THE WALL\n");
return ;
}
tot-=cnt;
printf("GOOD JOB CIRNO,SUCCESSFULLY BUILT THE HOUSE\n");
if(door<=2)
printf("HOUSE HAS NO DOOR\n");
else
printf("DOOR IS OK\n");
if(wall)
printf("WALL NEED TO BE FIXED\n");
else
printf("WALL IS OK\n");
cnt=0;
for(int i=hr;i<=hr+hx-1;i++)
for(int j=hc;j<=hc+hy-1;j++){
if(!onco(i,j))
continue;
for(int k=0;k<mh;k++){
if(!ice[i][j][k]){
corner=1;
ice[i][j][k]=1;
cnt++;
}
}
}
tot=max(0ll,tot-cnt);
if(cnt)
printf("CORNER NEED TO BE FIXED\n");
else
printf("CORNER IS OK\n");
printf("CIRNO FINALLY HAS %lld ICE_BLOCK(S)\n",tot);
if((!wall)&&(!block)&&(door==5)&&(!corner))
printf("CIRNO IS PERFECT!\n");
return ;
}
signed main(){
n=read();
hm=read();
hr=read();
hc=read();
hx=read();
hy=read();
m=read();
while(m--){
scanf("%s",s);
if(s[0]=='I')
ICE_BARRAGE();
else if(s[0]=='M'&&s[5]=='I')
MAKE_ICE_BLOCK();
else if(s[0]=='P')
PUT_ICE_BLOCK();
else if(s[0]=='R')
REMOVE_ICE_BLOCK();
else if(s[0]=='M'&&s[5]=='R')
MAKE_ROOF();
}
return 0;
}