#include <bits/stdc++.h>
const long long N = 1000006;
using namespace std;
const long long MOD = 1000000007LL;
template <typename T>
T gcd(T a, T b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
template <typename T>
T power(T x, T y, long long m = MOD) {
  T ans = 1;
  while (y > 0) {
    if (y & 1LL) ans = (ans * x) % m;
    y >>= 1LL;
    x = (x * x) % m;
  }
  return ans % m;
}
map<long long, long long> a[N];
map<long long, long long> b[N];
set<long long> og[N];
long long f[N];
long long n, m;
long long ch(long long x, long long y) {
  if (x < 0 || x >= n || y < 0 || y >= m) return 0;
  return a[x][y];
}
long long ch2(long long x, long long y) {
  if (x < 0 || x >= n || y < 0 || y >= m) return 0;
  return b[x][y];
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  long long ct = 1, tot = 0;
  vector<long long> v;
  for (long long(i) = (0); i < (n); i++) {
    for (long long(j) = (0); j < (m); j++) v.emplace_back(ct), a[i][j] = ct++;
  }
  for (long long(i) = (0); i < (n); i++) {
    for (long long(j) = (0); j < (m); j++) {
      og[a[i][j]].insert(ch(i - 1, j));
      og[a[i][j]].insert(ch(i, j - 1));
      og[a[i][j]].insert(ch(i, j + 1));
      og[a[i][j]].insert(ch(i + 1, j));
      og[a[i][j]].erase(0);
    }
  }
  if (n * m <= 100 || n < 4 || m < 4) {
    long long wct = 0, wtot = 1000;
    while (wct < wtot) {
      ++wct;
      random_shuffle(v.begin(), v.end());
      long long ct = 0;
      for (long long(i) = (0); i < (n); i++) {
        for (long long(j) = (0); j < (m); j++) {
          b[i][j] = v[ct];
          ++ct;
        }
      }
      bool f = 0;
      for (long long(i) = (0); i < (n); i++) {
        if (f) break;
        for (long long(j) = (0); j < (m); j++) {
          if (f) break;
          set<long long> temp;
          temp.insert(ch2(i - 1, j));
          temp.insert(ch2(i, j - 1));
          temp.insert(ch2(i, j + 1));
          temp.insert(ch2(i + 1, j));
          temp.erase(0);
          for (auto k : temp) {
            if (og[b[i][j]].find(k) != og[b[i][j]].end()) {
              f = 1;
              break;
            }
          }
        }
      }
      if (!f) {
        cout << "YES" << '\n';
        for (long long(i) = (0); i < (n); i++) {
          for (long long(j) = (0); j < (m); j++) {
            cout << b[i][j] << " ";
          }
          cout << '\n';
        }
        ++tot;
        return 0;
        break;
      }
    }
    if (!tot) {
      cout << "NO";
      return 0;
    }
  } else {
    vector<long long> primes = {2,  3,  5,  7,  11, 13, 17, 19, 23, 29, 31,
                                37, 41, 43, 47, 53, 59, 61, 67, 71, 73};
    long long prim;
    for (auto i : v) {
      if (m % i != 0) {
        prim = i;
        break;
      }
    }
    long long ct = 1;
    for (long long(i) = (0); i < (prim); i++) {
      for (long long j = i; j < n * m; j += prim) f[j] = ct++;
    }
    ct = 0;
    cout << "YES" << '\n';
    for (long long(i) = (0); i < (n * m); i++) {
      ++ct;
      cout << f[i] << " ";
      if (ct == m) {
        cout << '\n';
        ct = 0;
      }
    }
  }
}
