#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const long long inf = 1000000007;
const clock_t maxT = 1980;
vector<int> a;
int n, m;
inline bool nei(int a, int b) { return abs(a - b) == 1 || abs(a - b) == m; }
inline bool checkOne(int index) {
  int i = index / m;
  int j = index % m;
  int top = (i - 1) * m + j;
  int bottom = (i + 1) * m + j;
  int left = i * m + j - 1;
  int right = i * m + j + 1;
  if (i > 0 && nei(a[index], a[top])) return false;
  if (j > 0 && nei(a[index], a[left])) return false;
  if (i < n - 1 && nei(a[index], a[bottom])) return false;
  if (j < m - 1 && nei(a[index], a[right])) return false;
  return true;
}
bool check() {
  for (int i = 0; i < n * m; i++)
    if (!checkOne(i)) return false;
  return true;
}
int main() {
  clock_t timer = clock();
  scanf("%d %d", &n, &m);
  if (n >= 8 && m >= 8) {
    printf("YES\n");
    for (int i = 0; i < n; i++) {
      for (int j = 2 - (i & 1); j <= m; j += 2) printf("%d ", i * m + j);
      for (int j = 1 + (i & 1); j <= m; j += 2) printf("%d ", i * m + j);
      printf("\n");
    }
    return 0;
  }
  a.resize(n * m);
  for (int i = 0; i < n * m; i++) a[i] = i;
  do {
    random_shuffle(a.begin(), a.end());
  } while (clock() - timer < maxT && !check());
  if (!check()) {
    printf("NO\n");
    return 0;
  }
  printf("YES\n");
  for (int i = 0; i < n * m; i++) {
    printf("%d ", a[i] + 1);
    if (i % m == m - 1) printf("\n");
  }
  return 0;
}
