#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int ma[10][10];
bool vis[20];
int isok[20][20], tmp[20][20];
int n, m, ok = 0;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
void solve() {
  puts("YES");
  if (n > 4) {
    for (int i = 1; i <= m; i++) {
      if (i % 2) {
        for (int j = 1; j <= n; j += 2) printf("%d ", (i - 1) * n + j);
        for (int j = 2; j <= n; j += 2) printf("%d ", (i - 1) * n + j);
      } else {
        for (int j = 2; j <= n; j += 2) printf("%d ", (i - 1) * n + j);
        for (int j = 1; j <= n; j += 2) printf("%d ", (i - 1) * n + j);
      }
      puts("");
    }
  } else {
    int s1 = 1;
    int s2 = 2;
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= n; j++) {
        if (j % 2) {
          if (s1 > m) s1 = 2;
          printf("%d ", (s1 - 1) * n + j);
        } else {
          if (s2 > m) s2 = 1;
          printf("%d ", (s2 - 1) * n + j);
        }
      }
      s1 += 2;
      s2 += 2;
      puts("");
    }
  }
}
void init() {
  for (int i = 1; i < (m + 1); ++i)
    for (int j = 1; j < (n + 1); ++j) tmp[i][j] = (i - 1) * n + j;
  for (int i = 1; i < (n * m + 1); ++i)
    for (int j = 1; j < (m * n + 1); ++j) isok[i][j] = 1;
  for (int i = 1; i < (m + 1); ++i)
    for (int j = 1; j < (n + 1); ++j) {
      for (int k = 0; k < (4); ++k) {
        int xx = i + dx[k];
        int yy = j + dy[k];
        if (xx < 1 || xx > m || yy < 1 || yy > n)
          continue;
        else
          isok[tmp[xx][yy]][tmp[i][j]] = isok[tmp[i][j]][tmp[xx][yy]] = 0;
      }
    }
}
void dfs(int dep) {
  if (dep == n * m || ok) {
    ok = 1;
    return;
  } else {
    for (int i = 1; i < (n * m + 1); ++i) {
      int flag = 1;
      if (vis[i])
        continue;
      else {
        int flag = 1;
        ++dep;
        int row = (dep - 1) / n + 1;
        int col = (dep - 1) % n + 1;
        if (row > 1) {
          int nxt1 = ma[row - 1][col];
          if (!isok[nxt1][i]) flag = 0;
        }
        if (col > 1) {
          int nxt2 = ma[row][col - 1];
          if (!isok[nxt2][i]) flag = 0;
        }
        if (flag == 0) {
          dep--;
          continue;
        }
        ma[row][col] = i;
        vis[i] = 1;
        dfs(dep);
        if (ok) return;
        ma[row][col] = 0;
        vis[i] = 0;
        --dep;
      }
    }
  }
}
int main() {
  scanf("%d%d", &m, &n);
  if (max(n, m) > 4)
    solve();
  else {
    init();
    for (int i = 1; i < (n * m + 1); ++i)
      if (!ok) {
        memset(vis, 0, sizeof(vis));
        memset(ma, 0, sizeof(ma));
        vis[i] = 1;
        ma[1][1] = i;
        dfs(1);
      }
    if (!ok)
      printf("NO");
    else {
      puts("YES");
      for (int i = 1; i < (m + 1); ++i) {
        for (int j = 1; j < (n + 1); ++j) printf("%d ", ma[i][j]);
        puts("");
      }
    }
  }
  return 0;
}
