#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> adj[200111];
vector<int> arr[200111], cur[200111];
bool used[200111];
int pox[] = {0, 0, -1, 1};
int poy[] = {1, -1, 0, 0};
long long myrand() {
  long long x = ((1LL * rand() * (1LL << 20) + rand()) % (1LL * n * m)) + 1;
  return x;
}
bool check(int x, int i, int j) {
  if (i <= 0 || j <= 0) return 0;
  for (int v : adj[x]) {
    if (v == cur[i][j]) return 1;
  }
  return 0;
}
void solve() {
  int num = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      num = 0;
      long long x = myrand();
      while ((num < (n * m + 1000)) &&
             (used[x] == 1 || check(x, i - 1, j) || check(x, i, j - 1))) {
        x = myrand();
        num++;
      }
      if (num >= (n * m + 1000)) return;
      used[x] = 1;
      cur[i][j] = x;
    }
  }
  printf("YES\n");
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      printf("%d ", cur[i][j]);
    }
    printf("\n");
  }
  exit(0);
}
int main() {
  srand(44);
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    arr[i].resize(m + 10);
    cur[i].resize(m + 10);
    for (int j = 1; j <= m; j++) arr[i][j] = (i - 1) * m + j;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      for (int k = 0; k < 4; k++) {
        int nx = i + pox[k];
        int ny = j + poy[k];
        if (nx >= 1 && nx <= n && ny >= 1 && ny <= m)
          adj[arr[i][j]].push_back(arr[nx][ny]);
      }
    }
  }
  for (int i = 0; i < 70; i++) {
    memset(used, 0, sizeof(used));
    solve();
  }
  printf("NO\n");
  return 0;
}
