#include <bits/stdc++.h>
using namespace std;
int n, m, a[100005];
bool sw;
struct node {
  int x, id, wz;
} tmp[10];
int l[4][2][8] = {{{3, 1, 4, 2}, {2, 4, 1, 3}},
                  {{1, 3, 5, 2, 4}, {2, 4, 1, 3, 5}},
                  {{1, 3, 5, 2, 4, 6}, {2, 4, 6, 1, 3, 5}},
                  {{1, 3, 5, 7, 2, 4, 6}, {2, 4, 6, 1, 3, 5, 7}}};
int main() {
  scanf("%d%d", &n, &m);
  if (n == 1 && m == 1) {
    puts("YES");
    puts("1");
    return 0;
  } else if (n == 3 && m == 3) {
    puts("YES");
    puts("7 6 2");
    puts("1 8 4");
    puts("5 3 9");
    return 0;
  }
  if (max(n, m) <= 3) {
    puts("NO");
    return 0;
  } else if (n > m)
    swap(n, m), sw = 1;
  if (!sw) {
    for (int i = 1; i <= n * m; i++) a[i] = i;
  } else {
    for (int cnt = 1, i = 1; i <= m; i++)
      for (int j = 1; j <= n; j++, cnt++) a[(j - 1) * m + i] = cnt;
  }
  for (int i = 1, opt = 0; i <= n; i++, opt ^= 1) {
    for (int j = 1; j <= (m % 4 == 0 ? m : (m - 8)); j += 4) {
      for (int k = 1, k2 = (i - 1) * m + j; k <= 4; k++, k2++)
        tmp[k].x = a[k2], tmp[k].id = 0, tmp[k].wz = k;
      for (int k = 1, k2 = (i - 1) * m + j; k <= 4; k++, k2++)
        a[k2] = tmp[l[tmp[k].id][opt][k - 1]].x;
    }
    if (m % 4 != 0) {
      int ttmp = m - (m - 4) / 4 * 4;
      for (int k = 1, k2 = i * m - ttmp + 1; k2 <= i * m; k++, k2++)
        tmp[k].x = a[k2], tmp[k].id = ttmp - 4, tmp[k].wz = k;
      for (int k = 1, k2 = i * m - ttmp + 1; k2 <= i * m; k++, k2++)
        a[k2] = tmp[l[tmp[k].id][opt][k - 1]].x;
    }
  }
  puts("YES");
  if (!sw) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) printf("%d ", a[(i - 1) * m + j]);
      puts("");
    }
  } else {
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= n; j++) printf("%d ", a[(j - 1) * m + i]);
      puts("");
    }
  }
}
