#include <iostream>
using namespace std;
const int N=1e3+9;
const int tmax=1;
bool visit[N][N][tmax+1];//这样只可以代表0,1
int h[N][N];
bool flag=false;
int n,m,k;
int A,B,C,D;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
bool inmp(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m) return true;
else return false;
}
void dfs(int x,int y ,int t){
if(flag||(x==C&&y==D)){
flag=true;
return;
}
if(visit[x][y][t]) return;
visit[x][y][t]=true;
for(int i=0;i<4;++i){
int nx=x+dx[i];
int ny=y+dy[i];
if(!inmp(nx,ny)) continue;
//先不用燃料
//当这样设置的时候会提前剪枝。例如(先往上面访问,并且可以进入if语句,那么visit[x][y][t]就置为true,然后发现上面行不通的时候开始往下面走,但是这个时候这个visit[x][y][t]已经设为true,这就导致其他三个方向的无法进入。)
//最好的方法就是到大(x,y)点,设置为true,然后开始以这个为圆心,往外面扩展
if(h[x][y]>h[nx][ny]){
dfs(nx,ny,t);
}
if(h[x][y]+k>h[nx][ny]&&t<tmax){//并且还有燃料可以用
dfs(nx,ny,t+1);
}
}
}
int main()
{
cin>>n>>m>>k;
cin>>A>>B>>C>>D;
//布尔值默认为0
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>h[i][j];
}
}
dfs(A,B,0);
cout<<(flag?"Yes":"No");
// 请在此输入您的代码
return 0;
}
