//动态网格
// 题意简言之:M操作:更改单元格数字的值
// Q操作: 计算连通区域的个数
// 大致思路就是顺序枚举每一个1 ,然后深度搜索和这个1连通的区域并打上标记
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=105;
const int M=1005;//操作指令数的最大值
char map[N][N];//存储网格
char direct[M][M],h,z;
int t,r,c,n,st[N][N],ans[M],times,x,y;// t 测试数据组数,r行数,c列数,n操作数量 st判重数组,
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, 1, -1};//方向数组
void dfs(int x,int y,int id)
{
for(int i=0;i<4;i++)
{
int mx=x+dx[i],my=y+dy[i];
if(mx<0||mx>=r||my<0||my>=c) continue;
if(map[mx][my]=='1'&&!st[mx][my])
{
st[mx][my]=id;
dfs(mx,my,id);
}
}
}
int main()
{
scanf("%d",&t);
int id=1;
while(t--)
{
int t1=0;
scanf("%d%d",&r,&c);
for(int i=0;i<r;i++)
{
cin>>map[i];
}
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int cnt=0;
cin>>h;
if(h=='M')
{
cin>>x>>y;
cin>>z;
map[x][y]=z;
}
else
{
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(map[i][j]=='1'&&!st[i][j])
{
cnt++;
dfs(i,j,cnt);
}
}
}
ans[t1++]=cnt;
memset(st,0,sizeof(st));
}
}
cout << "Case #" << ++times << ":" <<endl;
for (int i = 0; i < t1; i++)
cout << ans[i] << endl;
memset(ans, 0, sizeof ans);
}
}