#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
int N, M;
bool nig(int a, int b) {
  a--, b--;
  int xa = a / M, ya = a % M;
  int xb = b / M, yb = b % M;
  return abs(xa - xb) + abs(ya - yb) <= 1;
}
bool can(vector<int>& a) {
  bool res = true;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      res &= !i || !nig(a[i * M + j], a[i * M + j - M]);
      res &= i + 1 >= N || !nig(a[i * M + j], a[i * M + j + M]);
      res &= !j || !nig(a[i * M + j], a[i * M + j - 1]);
      res &= j + 1 >= M || !nig(a[i * M + j], a[i * M + j + 1]);
    }
  }
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> N >> M;
  if (N == 1 && M == 1) {
    cout << "YES\n1\n";
    return 0;
  }
  if ((min(N, M) <= 2 && max(N, M) <= 3)) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  vector<int> a(N * M);
  int cur = 1;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      a[i * M + j] = cur;
      cur += 2;
      if (cur > N * M) cur = 2;
    }
  }
  if (N == 2) {
    reverse(a.begin() + M, a.end());
  }
  if (M == 2) {
    for (int i = 0; (i << 1) < N; i++) {
      swap(a[i * M + 1], a[(N - i - 1) * M + 1]);
    }
    if (N & 1) {
      cur = 1;
      for (int i = 0; i < N; i++) {
        a[i * M + (i & 1)] = cur;
        a[i * M + !(i & 1)] = N + cur;
        cur++;
        if (cur > N) break;
      }
    }
  }
  if (can(a)) {
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < M; j++) {
        cout << a[i * M + j] << " \n"[j + 1 == M];
      }
    }
    return 0;
  }
  while (true) {
    random_shuffle(a.begin(), a.end());
    if (can(a)) {
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          cout << a[i * M + j] << " \n"[j + 1 == M];
        }
      }
      return 0;
    }
  }
  return 0;
}
