#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(1 << countr_zero((unsigned)(j + 1))); } gi.back() = (1 << (i - 1)); if (H & (1 << i)) { vector ngh; if (gh.size() == 0) { ngh = gi; } else { ngh.push_back((1 << i)); for (int j: gh) ngh.push_back(j); ngh.back() = (1 << 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((1 << i)); for (int j: gw) ngw.push_back(j); ngw.back() = (1 << 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; } } for (int i = 0; i < H - 1; i++) gh[i + 1] ^= gh[i]; for (int i = 0; i < W - 1; i++) gw[i + 1] ^= gw[i]; if ((H - 1) * bit_ceil((unsigned)W) + W - 1 < (W - 1) * bit_ceil((unsigned)H) + H - 1) { int c = bit_ceil((unsigned)W); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { cout << gh[i] * c + gw[j] << (j == W - 1 ? '\n' : ' '); } } } else { int c = bit_ceil((unsigned)H); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { cout << gh[i] + gw[j] * c << (j == W - 1 ? '\n' : ' '); } } } }