#include <bits/stdc++.h>   using namespace std;   vector<int> A[100005];   int main() {     int n, m, i, j;     cin >> n >> m;     if (n < 4 and m < 4) {       bool adj[10][10] = {}, adj2[10][10];       int A[n][m], B[n][m];       for (i = 0; i < n; i++)         for (j = 0; j < m; j++) A[i][j] = i * m + j + 1;       for (i = 0; i < n; i++)         for (j = 0; j < m; j++) {           if (i - 1 >= 0) adj[A[i][j]][A[i - 1][j]] = 1;           if (i + 1 < n) adj[A[i][j]][A[i + 1][j]] = 1;           if (j - 1 >= 0) adj[A[i][j]][A[i][j - 1]] = 1;           if (j + 1 < m) adj[A[i][j]][A[i][j + 1]] = 1;         }       vector<int> v;       for (i = 1; i <= n * m; i++) v.push_back(i);       do {         memset(adj2, 0, sizeof adj2);         for (i = 0; i < n * m; i++) B[i / m][i % m] = v[i];         for (i = 0; i < n; i++)           for (j = 0; j < m; j++) {             if (i - 1 >= 0) adj2[B[i][j]][B[i - 1][j]] = 1;             if (i + 1 < n) adj2[B[i][j]][B[i + 1][j]] = 1;             if (j - 1 >= 0) adj2[B[i][j]][B[i][j - 1]] = 1;             if (j + 1 < m) adj2[B[i][j]][B[i][j + 1]] = 1;           }         for (i = 1; i <= n * m; i++)           for (j = 1; j <= n * m; j++)             if (adj[i][j] and adj2[i][j]) {               i = j = 1000000000;               break;             }         if (i < 1000000000 and j < 1000000000) {           cout <<  YES  <<   n ;           for (i = 0; i < n; i++) {             for (j = 0; j < m; j++) cout << B[i][j] <<    ;             cout <<   n ;           }           return 0;         }       } while (next_permutation((v).begin(), (v).end()));       cout <<  NO ;       return 0;     }     if (n == 1 and m == 4) {       cout <<  YES  <<   n  <<  2 4 1 3 ;       return 0;     }     if (n == 4 and m == 1) {       cout <<  YES  <<   n  <<  2 n4 n1 n3 ;       return 0;     }     if (n == 2 and m == 4) {       cout <<  YES  <<   n  <<  5 4 7 2 n3 6 1 8 ;       return 0;     }     if (n == 4 and m == 2) {       cout <<  YES  <<   n  <<  3 7 n8 4 n1 5 n6 2 ;       return 0;     }     if (n == 3 and m == 4) {       cout <<  YES  <<   n  <<  2 10 5 12 n7 1 3 6 n9 8 11 4 ;       return 0;     }     if (n == 4 and m == 3) {       cout <<  YES  <<   n  <<  3 8 1 n11 4 9 n6 10 5 n7 2 12 ;       return 0;     }     if (n == 4 and m == 4) {       cout <<  YES  <<   n  <<  5 4 7 2 n3 6 1 8 n13 12 15 10 n11 14 9 16 ;       return 0;     }     if (n >= 5) {       for (i = 0; i < n; i++)         for (j = 0; j < m; j++) A[i].push_back(i * m + j + 1);       vector<vector<int> > v1, v2;       for (i = 1; i < n; i += 2) v1.push_back(A[i]);       for (i = 0; i < n; i += 2) v2.push_back(A[i]);       j = 0;       for (auto v : v1) A[j++] = v;       for (auto v : v2) A[j++] = v;       for (j = 1; j < m; j += 2) {         int tmp = A[n - 1][j];         for (i = n - 1; i > 0; i--) A[i][j] = A[i - 1][j];         A[0][j] = tmp;       }       cout <<  YES  <<   n ;       for (i = 0; i < n; i++) {         for (j = 0; j < m; j++) cout << A[i][j] <<    ;         cout <<   n ;       }     } else {       for (i = 0; i < m; i++)         for (j = 0; j < n; j++) A[i].push_back(j * m + i + 1);       vector<vector<int> > v1, v2;       for (i = 1; i < m; i += 2) v1.push_back(A[i]);       for (i = 0; i < m; i += 2) v2.push_back(A[i]);       j = 0;       for (auto v : v1) A[j++] = v;       for (auto v : v2) A[j++] = v;       for (j = 1; j < n; j += 2) {         int tmp = A[m - 1][j];         for (i = m - 1; i > 0; i--) A[i][j] = A[i - 1][j];         A[0][j] = tmp;       }       cout <<  YES  <<   n ;       for (i = 0; i < n; i++) {         for (j = 0; j < m; j++) cout << A[j][i] <<    ;         cout <<   n ;       }     }     return 0;   }