#include #include #include int main() { using namespace std; int w, h, max_val = 0; cin >> w >> h; vector m(h, vector(w)); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cin >> m[i][j]; max_val = max(max_val, m[i][j]); } } constexpr int di[] = {-1, 0, 1, 0}; constexpr int dj[] = {0, -1, 0, 1}; auto calc_next = [&](int p) -> vector { int i = p / w, j = p % w; vector res; for (int k = 0; k < 4; k++) { int ni = i + di[k], nj = j + dj[k]; if (ni < 0 || ni >= h || nj < 0 || nj >= w) { continue; } if (m[i][j] == m[ni][nj]) { res.push_back(ni * w + nj); } } return res; }; for (int x = 1; x <= max_val; x++) { vector vis(h * w, false); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { int p = i * w + j; if (m[i][j] != x || vis[p]) { continue; } auto dfs = [&](auto dfs, int v, int p) -> void { for (int nv : calc_next(v)) { if (nv == p) { continue; } if (vis[nv]) { cout << "possible\n"; exit(0); } vis[nv] = true; dfs(dfs, nv, v); } }; dfs(dfs, p, -1); } } } cout << "impossible\n"; }