Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 350;
- int a[N][N], b[N][N];
- int mn[N], sum[N];
- pair<int, int> coord[N][N];
- void fail() {
- cout << -1;
- exit(0);
- }
- vector <pair<int, int>> pth;
- void gen_path(int n, int m) {
- pth.clear();
- if (n % 2 == 0) {
- pth.push_back({1, 1});
- for (int i = 1; i <= n; ++i) {
- if (i % 2) {
- for (int j = 2; j <= m; ++j) {
- pth.push_back({i, j});
- }
- }
- else {
- for (int j = m; j >= 2; --j) {
- pth.push_back({i, j});
- }
- }
- }
- for (int i = n; i > 1; --i) {
- pth.push_back({i, 1});
- }
- return;
- }
- pth.push_back({1, m});
- for (int i = m; i >= 1; --i) {
- if (i % 2 == 0) {
- for (int j = 2; j <= n; ++j) {
- pth.push_back({j, i});
- }
- }
- else {
- for (int j = n; j >= 2; --j) {
- pth.push_back({j, i});
- }
- }
- }
- for (int i = 1; i < m; ++i) {
- pth.push_back({1, i});
- }
- }
- void print(int i, int j, bool flag = false) {
- for (int k = 0; k < pth.size(); ++k) {
- if (pth[k] != make_pair(i, j)) continue;
- for (int id = k, j = 0; j < pth.size(); j++, id = (id + 1) % pth.size()) {
- if (flag) {
- int x = pth[id].first;
- int y = pth[id].second;
- cout << coord[x][y].first << " " << coord[x][y].second << "\n";
- }
- else {
- cout << pth[id].first << " " << pth[id].second << "\n";
- }
- }
- }
- }
- void solve() {
- int n, m;
- cin >> n >> m;
- if (n % 2 && m % 2) fail();
- gen_path(n, m);
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= m; ++j) {
- cin >> a[i][j];
- }
- }
- if (n % 2 == 0) {
- for (int i = 1; i <= n; ++i) {
- int cur = 0, s = 0;
- if (i % 2) {
- for (int j = 2; j <= m; ++j) {
- cur += a[i][j];
- if (cur < 0) s = max(s, abs(cur));
- }
- }
- else {
- for (int j = m; j >= 2; --j) {
- cur += a[i][j];
- if (cur < 0) s = max(s, abs(cur));
- }
- }
- sum[i] = cur;
- mn[i] = s;
- }
- int cur = 0, s = 0;
- for (int i = n; i >= 1; --i) {
- cur += a[i][1];
- if (cur < 0) s = max(s, abs(cur));
- }
- mn[n + 1] = s;
- sum[n + 1] = cur;
- for (int i = 1; i <= n; ++i) {
- for (int j = 2; j <= m; ++j) {
- int kek = 0;
- bool ok = 1;
- if (i % 2) {
- for (int id = j; id <= m; ++id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- else {
- for (int id = j; id >= 2; --id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- if (!ok) continue;
- for (int k = i + 1; k <= n + 1; ++k) {
- if (kek < mn[k]) {
- ok = 0;
- break;
- }
- kek += sum[k];
- }
- for (int k = 1; k < i; ++k) {
- if (kek < mn[k]) {
- ok = 0;
- break;
- }
- kek += sum[k];
- }
- if (i % 2) {
- for (int id = 2; id < j; ++id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- else {
- for (int id = m; id > j; --id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- if (!ok) continue;
- print(i, j);
- return;
- }
- for (int i = 1; i <= n; ++i) {
- int kek = 0;
- bool ok = 1;
- for (int j = i; j >= 1; --j) {
- kek += a[j][1];
- if (kek < 0) ok = 0;
- }
- for (int k = 1; k <= n; ++k) {
- if (kek < mn[k]) {
- ok = 0;
- break;
- }
- kek += sum[k];
- }
- for (int j = n; j > i; --j) {
- kek += a[j][1];
- if (kek < 0) ok = 0;
- }
- if (!ok) continue;
- print(i, 1);
- return;
- }
- }
- cout << -1;
- return;
- }
- pair<int, int> d = {1, 1};
- for (int i = m; i >= 1; --i) {
- for (int j = 1; j <= n; ++j) {
- coord[d.first][d.second] = {j, i};
- b[d.first][d.second] = a[j][i];
- d.second++;
- if (d.second == n + 1) {
- d.second = 1;
- d.first++;
- }
- }
- }
- swap(n, m);
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= m; ++j) {
- a[i][j] = b[i][j];
- }
- }
- gen_path(n, m);
- if (n % 2 == 0) {
- for (int i = 1; i <= n; ++i) {
- int cur = 0, s = 0;
- if (i % 2) {
- for (int j = 2; j <= m; ++j) {
- cur += a[i][j];
- if (cur < 0) s = max(s, abs(cur));
- }
- }
- else {
- for (int j = m; j >= 2; --j) {
- cur += a[i][j];
- if (cur < 0) s = max(s, abs(cur));
- }
- }
- sum[i] = cur;
- mn[i] = s;
- }
- int cur = 0, s = 0;
- for (int i = n; i >= 1; --i) {
- cur += a[i][1];
- if (cur < 0) s = max(s, abs(cur));
- }
- mn[n + 1] = s;
- sum[n + 1] = cur;
- for (int i = 1; i <= n; ++i) {
- for (int j = 2; j <= m; ++j) {
- int kek = 0;
- bool ok = 1;
- if (i % 2) {
- for (int id = j; id <= m; ++id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- else {
- for (int id = j; id >= 2; --id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- if (!ok) continue;
- for (int k = i + 1; k <= n + 1; ++k) {
- if (kek < mn[k]) {
- ok = 0;
- break;
- }
- kek += sum[k];
- }
- for (int k = 1; k < i; ++k) {
- if (kek < mn[k]) {
- ok = 0;
- break;
- }
- kek += sum[k];
- }
- if (i % 2) {
- for (int id = 2; id < j; ++id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- else {
- for (int id = m; id > j; --id) {
- kek += a[i][id];
- if (kek < 0) ok = 0;
- }
- }
- if (!ok) continue;
- print(i, j, 1);
- return;
- }
- for (int i = 1; i <= n; ++i) {
- int kek = 0;
- bool ok = 1;
- for (int j = i; j >= 1; --j) {
- kek += a[j][1];
- if (kek < 0) ok = 0;
- }
- for (int k = 1; k <= n; ++k) {
- if (kek < mn[k]) {
- ok = 0;
- break;
- }
- kek += sum[k];
- }
- for (int j = n; j > i; --j) {
- kek += a[j][1];
- if (kek < 0) ok = 0;
- }
- if (!ok) continue;
- print(i, 1, 1);
- return;
- }
- }
- cout << -1;
- return;
- }
- }
- int main() {
- ios::sync_with_stdio(0); cin.tie(0);
- cout.setf(ios::fixed); cout.precision(20);
- solve();
- return 0;
- }
Add Comment
Please, Sign In to add comment