#include<bits/stdc++.h>
using namespace std;
const int MOD=1145141,MAXN=505;
struct Node{int x,y,power;};
int N,M,Q,id,powerGrid[MAXN][MAXN];
char grid[MAXN][MAXN];
bool visited[MAXN][MAXN];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool calculatePower(int sx, int sy, int tx, int ty, int v) {
memset(visited,0,sizeof(visited));
queue<Node>q;q.push({sx,sy,0});
visited[sx][sy]=1;
while (!q.empty()) {
Node node=q.front();q.pop();
if (node.x==tx&&node.y==ty&&node.power==v)return 1;
for(int i=0;i<4;i++) {
int nx=node.x+dx[i];
int ny=node.y+dy[i];
if (nx>=0&&nx<N&&ny>=0&&ny<M&&!visited[nx][ny]&&grid[nx][ny]!='#'){
int new_power=(node.power*10+powerGrid[nx][ny])%MOD;
if (new_power<=v){
q.push({nx,ny,new_power});
visited[nx][ny]=1;
}
}
}
}
return 0;
}
int main(){
cin>>N>>M>>Q>>id;
for(int i=0;i<N;i++){
for (int j=0;j<M;j++){
cin>>powerGrid[i][j];
grid[i][j]='0';
}
}
for(int i=0;i<Q;i++){
int type;
cin>>type;
if(type==1){
int x,y;char c;
cin>>x>>y>>c;
if(c=='#'){
grid[x][y]='#';
}
else{
powerGrid[x][y]=c-'0';
grid[x][y]='0';
}
}
else{
int sx,sy,tx,ty,v;
cin>>sx>>sy>>tx>>ty>>v;
int result=calculatePower(sx,sy,tx,ty,v);
if (result){
cout<<"Yes"<<endl;
}
else{
cout <<"No"<< endl;
}
}
}
return 0;
}