#include <bits/stdc++.h>
using namespace std;
int N, m;
vector<int> V[100005], copy_[100005];
bool NoSolution(int row, int col) {
  if (row == 1 && col == 2) return true;
  if (row == 2 && col == 2) return true;
  if (row == 1 && col == 3) return true;
  if (row == 2 && col == 3) return true;
  return false;
}
void rotate_(int index) {
  int last = V[index][V[index].size() - 1];
  int pre = V[index][V[index].size() - 2];
  for (int i = V[index].size() - 1; i >= 2; --i) V[index][i] = V[index][i - 2];
  V[index][1] = last;
  V[index][0] = pre;
}
int main() {
  int i, j, x, y;
  scanf("%d%d", &N, &m);
  x = N;
  y = m;
  if (NoSolution(min(N, m), max(N, m))) {
    puts("NO");
    return 0;
  }
  if (N == 1 && m == 1) {
    printf("YES\n1\n");
    return 0;
  } else if (N == 3 && m == 3) {
    printf("YES\n6 1 8\n7 5 3\n2 9 4\n");
    return 0;
  }
  int Count = 1;
  for (i = 0; i < N; ++i) {
    for (j = 0; j < m; ++j) V[i].emplace_back(Count++);
  }
  if (x > y) {
    for (i = 0; i < m; ++i) {
      for (j = 0; j < N; ++j) {
        copy_[i].emplace_back(V[j][i]);
      }
    }
    for (i = 0; i < N; ++i) {
      if (i > m)
        V[i].clear();
      else
        V[i] = copy_[i];
    }
    swap(N, m);
  }
  if (N == 1) {
    if (m == 4) {
      V[0][0] = 2;
      V[0][1] = 4;
      V[0][2] = 1;
      V[0][3] = 3;
    } else {
      for (i = 0, j = 0; j < N * m; ++i, j += 2) V[0][i] = j + 1;
      for (j = 1; j < N * m; j += 2, ++i) V[0][i] = j + 1;
    }
  } else if (N >= 2 && m >= 4) {
    for (i = 0; i < N; i += 2) rotate_(i);
    for (j = 0; j < m; j += 2) {
      int start = V[0][j];
      for (i = 1; i < N; ++i) V[i - 1][j] = V[i][j];
      V[N - 1][j] = start;
    }
  }
  puts("YES");
  if (x > y) {
    for (j = 0; j < m; ++j) {
      for (i = 0; i < N; ++i) {
        printf("%d ", V[i][j]);
      }
      puts("");
    }
  } else {
    for (i = 0; i < N; ++i) {
      for (j = 0; j < m; ++j) printf("%d ", V[i][j]);
      puts("");
    }
  }
  return 0;
}
