#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<int> > board;
bool check(int x, int y) {
  pair<int, int> p1 = make_pair(x / m, x % m);
  pair<int, int> p2 = make_pair(y / m, y % m);
  return abs(p1.first - p2.first) + abs(p1.second - p2.second) == 1;
}
pair<int, int> get() {
  for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < m; j++) {
      if (check(board[i][j], board[i + 1][j])) {
        return make_pair(i, j);
      }
    }
  }
  for (int i = 0; i < m - 1; i++) {
    for (int j = 0; j < n; j++) {
      if (check(board[j][i], board[j][i + 1])) {
        return make_pair(j, i);
      }
    }
  }
  return make_pair(-1, -1);
}
int main() {
  srand(time(NULL));
  scanf("%d %d", &n, &m);
  vector<int> g(n * m);
  for (int i = 0; i < n * m; i++) {
    g[i] = i;
  }
  random_shuffle(g.begin(), g.end());
  board = vector<vector<int> >(n, vector<int>(m, 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      board[i][j] = g[i * m + j];
    }
  }
  while (clock() < 1.0 * CLOCKS_PER_SEC) {
    pair<int, int> t = get();
    if (t.first == -1) {
      puts("YES");
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          printf("%d ", board[i][j] + 1);
        }
        puts("");
      }
      exit(0);
    }
    int i = abs(rand()) % n;
    int j = abs(rand()) % m;
    swap(board[i][j], board[t.first][t.second]);
  }
  puts("NO");
  return 0;
}
