1 #include "stdio.h"
2 #include "string.h"
3 #define maxd 10000
4 int r,c,n;
5 struct Command{
6 char c[5];//操作,比如EX,IR
7 int r1,c1,r2,c2;// EX交换的坐标
8 int a,x[20];//a:每次操作的操作次数(非EX),比如 IR 2 1 5,插入1和5,a=2
9 //x[20],记录每次操作对应的内容,也就是上面的1 5
10 }cmd[maxd];
11 int simulate(int *r0,int *c0)
12 {
13 for(int i=0;i<n;i++)
14 {
15 if(cmd[i].c[0]=='E')//交换操作
16 {
17 if(cmd[i].r1==*r0&&cmd[i].c1==*c0)//要交换的是查找的数
18 {
19 *r0=cmd[i].r2;
20 *c0=cmd[i].c2;
21 }
22 else if(cmd[i].r2==*r0&&cmd[i].c2==*c0)//查找的是要被交换的数
23 {
24 *r0=cmd[i].r1;
25 *c0=cmd[i].c1;
26 }
27 }
28 else
29 {
30 int dr=0,dc=0;//dr要修改的行 dc要修改的列
31 for(int j=0;j<cmd[i].a;j++)
32 {
33 int x=cmd[i].x[j];
34 if(cmd[i].c[0]=='I')//插入
35 {
36 if(cmd[i].c[1]=='R'&&x<=*r0)//插入列,且插入在*r0及其前面才需要管
37 dr++;
38 if(cmd[i].c[1]=='C'&&x<=*c0)
39 dc++;
40 }
41 else//删除
42 {
43 if(cmd[i].c[1]=='R'&&x==*r0)//要查询的行被删除
44 return 0;
45 if(cmd[i].c[1]=='C'&&x==*c0)//要查询的列被删除
46 return 0;
47 if(cmd[i].c[1]=='R'&&x<*r0)
48 dr--;
49 if(cmd[i].c[1]=='C'&&x<*c0)
50 dc--;
51 }
52 }
53 *r0+=dr;
54 *c0+=dc;
55 }
56 }
57 return 1;
58 }
59 int main()
60 {
61 int r0,c0,kase=0,q;
62 while(scanf("%d%d%d",&r,&c,&n)==3&&r)//输入行列和操作次数n
63 {
64 for(int i=0;i<n;i++)
65 {
66 scanf("%s",cmd[i].c);
67 if(cmd[i].c[0]=='E')//EX操作为交换
68 {
69 //输入交换的两组坐标
70 scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);
71 }
72 else
73 {
74 scanf("%d",&cmd[i].a);//输入操作数目
75 for(int j=0;j<cmd[i].a;j++)
76 {
77 scanf("%d",&cmd[i].x[j]);
78 }
79 }
80 }
81 if(kase>0)
82 printf("\n");
83 printf("Spreadsheet #%d\n",++kase);
84 scanf("%d",&q);//输入查询次数
85 while(q--)
86 {
87 scanf("%d%d",&r0,&c0);
88 printf("Cell data in (%d,%d) ",r0,c0);
89 if(!simulate(&r0,&c0))
90 printf("GONE\n");
91 else
92 printf("moved to (%d,%d)\n",r0,c0);
93 }
94 }
95 return 0;
96 }