//模版题咯。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f1[3205][3205],f2[3205][3205],n,m,x,y,X1,X2,Y1,Y2,a[810][810],xro,maxa,mina,L,t;
bool xflag;
void ins_1D(int ro,int l,int r){
if (l==r){
if (xflag) {
f1[xro][ro]=f2[xro][ro]=a[x][y];
return ;
}
f1[xro][ro]=max(f1[xro*2][ro],f1[xro*2+1][ro]);
f2[xro][ro]=min(f2[xro*2][ro],f2[xro*2+1][ro]);
return ;
}
int mid=l+((r-l)>>1);
if (y<=mid) ins_1D(ro*2,l,mid);
else ins_1D(ro*2+1,mid+1,r);
f1[xro][ro]=max(f1[xro][ro*2],f1[xro][ro*2+1]);
f2[xro][ro]=min(f2[xro][ro*2],f2[xro][ro*2+1]);
}
void ins_2D(int ro,int l,int r){
if (l==r) {
xro=ro;xflag=1;ins_1D(1,1,n);
}
else {
int mid=l+((r-l)>>1);//为什么用这种写法?不会加爆!
if (x<=mid) ins_2D(ro*2,l,mid);
else ins_2D(ro*2+1,mid+1,r);
xro=ro;xflag=0;ins_1D(1,1,n);
}
}
void query_1D(int ro,int l,int r){
if (Y1<=l&&r<=Y2){
maxa=max(f1[xro][ro],maxa);
mina=min(f2[xro][ro],mina);
return ;
}
int mid=l+((r-l)>>1);
if (mid>=Y1) query_1D(ro*2,l,mid);
if (mid<Y2) query_1D(ro*2+1,mid+1,r);
}
void query_2D(int ro,int l,int r){
if (X1<=l&&r<=X2){
xro=ro;query_1D(1,1,n);
return ;
}
int mid=l+((r-l)>>1);
if (mid>=X1) query_2D(ro*2,l,mid);
if (mid<X2) query_2D(ro*2+1,mid+1,r);
}
int main(){
scanf("%d",&t);
for (int T=1;T<=t;T++){
printf("Case #%d:\n",T);
scanf("%d",&n);
memset(a,0,sizeof(a));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
memset(f1,0,sizeof(f1));
memset(f2,0x7f,sizeof(f2));
for (x=1;x<=n;x++)
for (y=1;y<=n;y++)
ins_2D(1,1,n);
scanf("%d",&m);
for (int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&L);
X1=max(x-L/2,1);X2=min(x+L/2,n);
Y1=max(y-L/2,1);Y2=min(y+L/2,n);
maxa=0;mina=2147483647;
query_2D(1,1,n);
a[x][y]=mina+((maxa-mina)>>1);
ins_2D(1,1,n);
printf("%d\n",a[x][y]);
}
}
}