#include using namespace std; #define REP(i,a,b) for(int i=a;i<(int)b;i++) #define rep(i,n) REP(i,0,n) #define all(c) (c).begin(), (c).end() #define zero(a) memset(a, 0, sizeof a) #define minus(a) memset(a, -1, sizeof a) #define watch(a) { cout << #a << " = " << a << endl; } template inline bool minimize(T1 &a, T2 b) { return b < a && (a = b, 1); } template inline bool maximize(T1 &a, T2 b) { return a < b && (a = b, 1); } typedef long long ll; int const inf = 1<<29; template constexpr bool in_range(T y, T x, T H, T W) { return 0<=y&&y> H >> W; int sy, sx, gy, gx; cin >> sy >> sx >> gy >> gx; sy --, sx --, gy --, gx --; vector v(H); rep(i, H) { cin >> v[i]; } queue> q; vector> dist(H, vector(W, 0)); dist[sy][sx] = 1; q.emplace(sy, sx); while(!q.empty()) { int y, x; tie(y, x) = q.front(); q.pop(); if(y == gy && x == gx) { cout << "YES\n"; exit(0); } for(int i=0; i<4; i++) { int ny = y + dy[i], nx = x + dx[i]; if(in_range(ny, nx, H, W) && !dist[ny][nx]) { if(abs(v[y][x] - v[ny][nx]) <= 1) { dist[ny][nx] = 1; q.emplace(ny, nx); } } ny = y + dy[i] * 2, nx = x + dx[i] * 2; if(in_range(ny, nx, H, W) && !dist[ny][nx]) { if(v[y][x] > v[y + dy[i]][x + dx[i]] && v[y][x] == v[ny][nx]) { dist[ny][nx] = 1; q.emplace(ny, nx); } } } } cout << "NO\n"; return 0; }