#include #include #include #include using namespace std; int main() { int n, r; cin >> n >> r; vector> scores(r, vector(2 * n)); for(auto& v : scores) for(auto& x : v) cin >> x; vector left, right; for(int i = 0; i < 2 * n; ++i) { if(scores[0][i] > n) left.push_back(i); else right.push_back(i); } assert(left.size() == n); assert(right.size() == n); vector> g(n, vector(n)); for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { bool ok = true; for(int k = 0; k < r; ++k) { if((scores[k][left[i]] > n) + (scores[k][right[j]] > n) != 1) { ok = false; break; } } g[i][j] = ok; } } vector mt(n, -1); vector used; function dfs; long long ops = 0; dfs = [&](int v) -> bool { if(used[v]) return false; used[v] = true; for(int i = 0; i < n; ++i) { ops += 1; if(!g[v][i]) continue; if(mt[i] == -1 || dfs(mt[i])) { mt[i] = v; return true; } } return false; }; for(int i = 0; i < n; ++i) { used.assign(n, false); if(!dfs(i)) { cout << "impossible" << endl; cerr << "ops: " << ops << endl; return 0; } } cout << "possible" << endl; cerr << "ops: " << ops << endl; }