#include "bits/stdc++.h" using namespace std; #define DEBUG(x) cout<<#x<<": "< #define vl vector #define vii vector< vector > #define vll vector< vector > #define vs vector #define pii pair #define pis pair #define psi pair #define pll pair #define fi first #define se second #define rep(i,n) for(int i=0;i<(int)(n);i++) #define rep1(i,n) for(int i=1;i<=(int)(n);i++) #define in(x, a, b) (a <= x && x < b) #define all(c) c.begin(),c.end() const ll inf = 1000000001; const ll INF = 2e18; const ll MOD = 1000000007; //const ll mod = 1000000009; const double pi = 3.14159265358979323846; #define Sp(p) cout< struct Point { int i0, j0, i1, j1; int len; Point(int i0, int j0, int i1, int j1) :i0(i0), j0(j0), i1(i1), j1(j1) { len = max(abs(i0 - i1), abs(j0 - j1)) + 1; } Point() {} }; int ma = -inf; int n, k; vector ans; void solve(vi &l, vii a) { int idx = 0; int sum = 0; for (int i = l.size() - 1; i >= 0; i--) { sum += l[i]; if (sum >= n * n) { idx = i; break; } } vector res; int tar; for (int i = 0; i < k; i++) { if (i < idx) { tar = 1; } else { tar = 0; } pair p; p.first = -inf; rep(j, n) { if (j + l[i] - 1 >= n) { break; } rep(k, n) { int cnt = 0; rep(k2, l[i]) { if (a[j + k2][k] == tar) { cnt--; } else { cnt++; } } if (cnt > p.first) { p = make_pair(cnt, Point(j, k, j + l[i] - 1, k)); } } } rep(j, n) { rep(k, n) { if (k + l[i] - 1 >= n) { break; } int cnt = 0; rep(k2, l[i]) { if (a[j][k + k2] == tar) { cnt--; } else { cnt++; } } if (cnt > p.first) { p = make_pair(cnt, Point(j, k, j, k + l[i] - 1)); } } } for (int j = p.second.i0; j <= p.second.i1; j++) { for (int k = p.second.j0; k <= p.second.j1; k++) { a[j][k] = 1 - a[j][k]; } } res.push_back(p.second); } int cnt = 0; rep(i, n) { rep(j, n) { if (a[i][j] == 0) { cnt++; } } } //DEBUG(cnt); if (cnt > ma) { ma = cnt; ans = res; } } int main() { auto start = clock(); random_device seed_gen; mt19937 rand(seed_gen()); cin >> n >> k; vi lori(k); rep(i, k) { cin >> lori[i]; } vii aori(n, vi(n)); rep(i, n) { rep(j, n) { char c; scanf(" %c", &c); aori[i][j] = c - '0'; } } vi l = lori; sort(all(l), greater()); solve(l, aori); l = lori; sort(all(l)); solve(l, aori); while ((clock() - start) < 0.8 * CLOCKS_PER_SEC) { shuffle(all(l), rand); solve(l, aori); } vector used(k, false); rep(i, k) { rep(j, k) { if (!used[j] && ans[j].len == lori[i]) { used[j] = true; cout << ans[j].i0 + 1<< " " << ans[j].j0 + 1 << " " << ans[j].i1 + 1 << " " << ans[j].j1 + 1 << endl; break; } } } }