#include <cstdio>
#include <cstring>
const int argc[7]={2,0,3,4,4,5,3};
int Get_command_type(char ch)
{
int r=-1;
switch(ch)
{
case 'I': r=0; break;
case 'C': r=1; break;
case 'L': r=2; break;
case 'V': r=3; break;
case 'H': r=4; break;
case 'K': r=5; break;
case 'F': r=6; break;
case 'S': r=7; break;
case 'X': r=8; break;
}
return r;
}
const int NMAX=251;
int N,M;
char canvas[NMAX][NMAX];
void Clear()
{
for(int i=1;i<=N;i++)
{
memset(canvas[i]+1,'O',M*sizeof(char));
canvas[i][M+1]=NULL;
}
}
void Init(int n,int m)
{
N=n;
M=m;
Clear();
}
void Color_pixel(int x,int y,int color)
{
canvas[y][x]=color;
}
void Draw_vertical_segment(int x,int y1,int y2,int color)
{
for(int i=y1;i<y2;i++)
{
Color_pixel(i,x,color);
}
}
void Draw_horizontal_segment(int x1,int x2,int y,int color)
{
for(int i=x1;i<x2;i++)
{
Color_pixel(y,i,color);
}
}
void Draw_rectangle(int x1,int y1,int x2,int y2,int color)
{
for(int i=y1;i<=y2;i++)
{
for(int j=x1;j<=x2;j++)
Color_pixel(j,i,color);
}
}
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
bool Is_in_range(int x,int n)
{
return x>0 && x<=n;
}
void Fill(int x,int y,int color)
{
for(int d=0;d<4;d++)
{
int x1=x+dx[d],y1=y+dy[d];
if(!Is_in_range(x1,N) || !Is_in_range(y1,M))
return;
if(canvas[y1][x1]==canvas[y][x])
{
Color_pixel(x,y,color);
Fill(x1,y1,color);
}
}
}
void Save(char *name,FILE *out)
{
fprintf(out,"%s\n",name);
for(int i=1;i<=N;i++)
{
fprintf(out,"%s\n",canvas[i]+1);
}
}
bool Run_command(FILE *in,FILE *out)
{
char command;
fscanf(in,"%c ",&command);
int args[10];
if(Get_command_type(command)==-1)
{
while(command!='\n')
{
command=fgetc(in);
}
return false;
}
if(Get_command_type(command)<7)
{
char color;
if(Get_command_type(command)>=2)
{
for(int i=0;i<argc[Get_command_type(command)]-1;i++)
fscanf(in,"%d ",&args[i]);
fscanf(in,"%c ",&color);
}
else
{
for(int i=0;i<argc[Get_command_type(command)];i++)
fscanf(in,"%d ",&args[i]);
}
switch(command)
{
case 'I': Init(args[0],args[1]); break;
case 'C': Clear(); break;
case 'L': Color_pixel(args[0],args[1],color); break;
case 'V': Draw_vertical_segment(args[0],args[1],args[2],color); break;
case 'H': Draw_horizontal_segment(args[0],args[1],args[2],color); break;
case 'K': Draw_rectangle(args[0],args[1],args[2],args[3],color); break;
case 'F': Fill(args[0],args[1],color); break;
}
}
else
{
if(command=='X')
return true;
char name[100];
fgets(name,strlen(name),in);
if(name[strlen(name)-1]=='\n')
name[strlen(name)-1]=NULL;
Save(name,out);
}
return false;
}
int main()
{
FILE *in=fopen("a.in","r"),*out=fopen("a.out","w");
bool quit=false;
while(!quit)
{
quit=Run_command(in,out);
}
fclose(in);
fclose(out);
return 0;
}