#include <bits/stdc++.h>
using namespace std;
namespace Treap {
struct node {
  node *son[2];
  int value, _rand, _size;
  bool rev;
  node(int val) {
    value = val;
    _rand = rand();
    _size = 1;
    son[0] = son[1] = NULL;
    rev = false;
  }
  void pushdown() {
    if (!rev) return;
    rev = false;
    std::swap(son[0], son[1]);
    if (son[0]) son[0]->rev ^= 1;
    if (son[1]) son[1]->rev ^= 1;
  }
  void maintain() { _size = son[0]->size() + 1 + son[1]->size(); }
  int size() { return this == NULL ? 0 : _size; }
} * root, *a, *b, *c;
void split(node *t, int rank, node *&x, node *&y) {
  if (t == NULL) return void((x = NULL) || (y = NULL));
  t->pushdown();
  if (t->son[0]->size() + 1 < rank)
    x = t, split(t->son[1], rank - t->son[0]->size() - 1, t->son[1], y);
  else
    y = t, split(t->son[0], rank, x, t->son[0]);
  t->maintain();
}
node *merge(node *x, node *y) {
  if (!x || !y) return x ? x : y;
  x->pushdown();
  y->pushdown();
  if (x->_rand < y->_rand) {
    x->son[1] = merge(x->son[1], y);
    x->maintain();
    return x;
  } else {
    y->son[0] = merge(x, y->son[0]);
    y->maintain();
    return y;
  }
}
node *build(int l, int r) {
  int mid = l + r >> 1;
  node *t = new node(mid);
  if (l < mid) t->son[0] = build(l, mid - 1);
  if (mid < r) t->son[1] = build(mid + 1, r);
  t->maintain();
  return t;
}
void print(node *t) {
  t->pushdown();
  if (t->son[0]) print(t->son[0]);
  printf("%d ", t->value);
  if (t->son[1]) print(t->son[1]);
}
void reverse(int l, int r) {
  split(root, r + 1, a, c);
  split(a, l, a, b);
  b->rev ^= 1;
  root = merge(merge(a, b), c);
}
}  // namespace Treap
inline int read() {
  int x;
  scanf("%d", &x);
  return x;
}
int n, m;
vector<int> mt[100100];
int vis[100100];
inline bool check(int a, int b) {
  if (abs(a - b) == m) return 1;
  if (a % m)
    if (a + 1 == b) return 1;
  if (b % m)
    if (b + 1 == a) return 1;
  return 0;
}
void dfs(int p, int x, int y, int id) {
  if (y == m) {
    dfs(p, x + 1, 0, id);
    return;
  }
  if (p == n * m) {
    printf("YES\n");
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) printf("%d ", mt[i][j]);
      printf("\n");
    }
    exit(0);
  }
  bool flag = true;
  for (int i = id; i <= m * n; i++) {
    if (flag) id = i;
    if (vis[i]) continue;
    flag = 0;
    if (x && check(mt[x - 1][y], i)) continue;
    if (y && check(mt[x][y - 1], i)) continue;
    vis[i]++;
    mt[x][y] = i;
    dfs(p + 1, x, y + 1, id);
    vis[i]--;
  }
}
int main() {
  n = read();
  m = read();
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) mt[i].push_back(0);
  dfs(0, 0, 0, 1);
  return 0 * puts("NO");
}
