#include <bits/stdc++.h>
using namespace std;
int setb(int n, int pos) { return n = n | (1 << pos); }
int resb(int n, int pos) { return n = n & ~(1 << pos); }
bool checkb(int n, int pos) { return (bool)(n & (1 << pos)); }
vector<int> act[100005], ara[100005], tmp[100005];
int marker[100005][2];
int n, m;
void prework() {
  int cur = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cur++;
      marker[cur][0] = i;
      marker[cur][1] = j;
      act[i].push_back(cur);
      ara[i].push_back(0);
      tmp[i].push_back(0);
    }
  }
}
void fuck() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      tmp[i][j] = ara[i][j];
    }
  }
}
void solve() {
  int cur = 0;
  for (int i = 0; i < n; i += 2) {
    for (int j = 0; j < m; j++) ara[i][j] = act[cur][j];
    cur++;
  }
  for (int i = 1; i < n; i += 2) {
    for (int j = 0; j < m; j++) ara[i][j] = act[cur][j];
    cur++;
  }
  fuck();
  cur = 0;
  for (int j = 0; j < m; j += 2) {
    for (int i = 0; i < n; i++) ara[i][j] = tmp[i][cur];
    cur++;
  }
  for (int j = 1; j < m; j += 2) {
    for (int i = 0; i < n; i++) ara[i][j] = tmp[i][cur];
    cur++;
  }
}
int dx[] = {+0, +0, -1, +1};
int dy[] = {-1, +1, +0, +0};
inline bool oka(int curx, int cury) {
  return (0 <= curx && curx < n && 0 <= cury && cury < m);
}
bool match(vector<int> a, vector<int> b) {
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < b.size(); j++) {
      if (a[i] == b[j]) return true;
    }
  }
  return false;
}
bool check() {
  vector<int> origin, my;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      int val = ara[i][j];
      my.clear();
      for (int k = 0; k < 4; k++) {
        int curx = i + dx[k];
        int cury = j + dy[k];
        if (oka(curx, cury)) my.push_back(ara[curx][cury]);
      }
      origin.clear();
      for (int k = 0; k < 4; k++) {
        int curx = marker[val][0] + dx[k];
        int cury = marker[val][1] + dy[k];
        if (oka(curx, cury)) origin.push_back(act[curx][cury]);
      }
      if (match(origin, my)) return false;
    }
  }
  return true;
}
void show() {
  puts("YES");
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (j) printf(" ");
      printf("%d", ara[i][j]);
    }
    printf("\n");
  }
  assert(check());
}
double start;
void small() {
  vector<int> lol;
  for (int i = 0; i < n * m; i++) {
    lol.push_back(i + 1);
  }
  int flag = 0;
  while (1) {
    double duration = (clock() - start) / (double)CLOCKS_PER_SEC;
    if (duration > 1.9) break;
    random_shuffle(lol.begin(), lol.end());
    int cur = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        ara[i][j] = lol[cur++];
      }
    }
    if (check()) {
      flag = 1;
      break;
    }
  }
  if (flag)
    show();
  else
    puts("NO");
}
int main() {
  start = clock();
  scanf("%d %d", &n, &m);
  prework();
  if (min(n, m) <= 4) {
    small();
    return 0;
  }
  solve();
  show();
  return 0;
}
