import std.stdio, std.conv, std.string, std.bigint; import std.math, std.random, std.datetime; import std.array, std.range, std.algorithm, std.container; string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; } class Cell{ Cell[] cells; Cell parent; int id; int value; int isDone; this(int id, int value){ this.id = id; this.value = value; } bool hasCycle(){ debug writeln("(", this.id, ")"); this.isDone = 1; foreach(c; cells){ if(c.value != this.value) continue; if(this.parent && c.id == this.parent.id) continue; if(! c.isDone){ c.parent = this; if(c.hasCycle) return 1; } else return 1; } return 0; } } Cell[] cells; int w, h; void main(){ w = read.to!int; h = read.to!int; foreach(i; 0 .. w * h) cells ~= new Cell(i, read.to!int); foreach(i; 0 .. w * h){ if(i % w != 0) cells[i].cells ~= cells[i - 1]; if(i % w != w - 1) cells[i].cells ~= cells[i + 1]; if(i / w != 0) cells[i].cells ~= cells[i - w]; if(i / w != h - 1) cells[i].cells ~= cells[i + w]; } foreach(cell; cells){ if(cell.isDone) continue; else{ if(cell.hasCycle) writeln("possible"); else continue; return; } } writeln("impossible"); return; }