#include using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int H, W; cin >> H >> W; if (H % 2 == 1 || W % 2 == 1) { cout << "-1\n"; return 0; } vector gh, gw; for (int i = 1; i < 20; i++) { vector gi; for (int j = 0; j < (1 << i); j++) { gi.push_back(countr_zero((unsigned)(j + 1))); } gi.back() = (i - 1); if (H & (1 << i)) { vector ngh; if (gh.size() == 0) { ngh = gi; } else { ngh.push_back(i); for (int j: gh) ngh.push_back(j); ngh.back() = i; int l = find(gi.begin(), gi.end(), gh.back()) - gi.begin(); for (int j = 1; j < (1 << i); j++) ngh.push_back(gi[(l + j) % (1 << i)]); } gh = ngh; } if (W & (1 << i)) { vector ngw; if (gw.size() == 0) { ngw = gi; } else { ngw.push_back(i); for (int j: gw) ngw.push_back(j); ngw.back() = i; int l = find(gi.begin(), gi.end(), gw.back()) - gi.begin(); for (int j = 1; j < (1 << i); j++) ngw.push_back(gi[(l + j) % (1 << i)]); } gw = ngw; } } int mh = *max_element(gh.begin(), gh.end()) + 1, mw = *max_element(gw.begin(), gw.end()) + 1; vector> ans; int ansm = 1e9; // h for (int l = 0; l <= mw; l++) { vector P(H), Q(W); for (int i = 0; i < H - 1; i++) { P[i + 1] = P[i] ^ (1 << (l + gh[i])); } for (int i = 0; i < W - 1; i++) { Q[i + 1] = Q[i] ^ (1 << (gw[i] < l ? gw[i] : mh + gw[i])); } vector> nans(H, vector(W)); int nm = 0; for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { nans[i][j] = P[i] | Q[j]; nm = max(nm, nans[i][j]); } } if (nm < ansm) { ansm = nm; ans = nans; } } // w for (int l = 0; l <= mh; l++) { vector P(H), Q(W); for (int i = 0; i < H - 1; i++) { P[i + 1] = P[i] ^ (1 << (gh[i] < l ? gh[i] : mw + gh[i])); } for (int i = 0; i < W - 1; i++) { Q[i + 1] = Q[i] ^ (1 << (l + gw[i])); } vector> nans(H, vector(W)); int nm = 0; for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { nans[i][j] = P[i] | Q[j]; nm = max(nm, nans[i][j]); } } if (nm < ansm) { ansm = nm; ans = nans; } } for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { cout << ans[i][j] << (j == W - 1 ? '\n' : ' '); } } }