#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105000;
int n;
int a[MAXN];
bool used[MAXN];
int dp[(1 << 20) + 123];
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
vector<int> factorize(int x) {
  vector<int> factors;
  for (int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
      factors.push_back(i);
      while (x % i == 0) x /= i;
    }
  }
  if (x > 1) factors.push_back(x);
  return factors;
}
void check(int x, int y) {
  for (int i = 0; i < n; i++) used[i] = false;
  used[x] = used[y] = true;
  vector<int> factorsX = factorize(a[x]);
  vector<int> factorsY = factorize(a[y]);
  vector<int> take = {x, y};
  for (int f : factorsX)
    for (int i = 0; i < n; i++)
      if (!used[i] && (a[i] % f != 0)) {
        used[i] = true;
        take.push_back(i);
        break;
      }
  for (int f : factorsY)
    for (int i = 0; i < n; i++)
      if (!used[i] && (a[i] % f != 0)) {
        used[i] = true;
        take.push_back(i);
        break;
      }
  int m = (int)take.size();
  for (int mask = 1; mask < (1 << m); mask++) {
    for (int i = 0; i < m; i++)
      if (mask & (1 << i)) {
        dp[mask] = a[take[i]];
        if (mask ^ (1 << i)) dp[mask] = gcd(dp[mask], dp[mask ^ (1 << i)]);
      }
  }
  for (int mask = 1; mask < (1 << m); mask++) {
    int invMask = ((1 << m) - 1) ^ mask;
    if (dp[mask] == 1 && dp[invMask] == 1) {
      puts("YES");
      vector<int> ans(n, 1);
      for (int i = 0; i < m; i++) {
        if (mask & (1 << i)) ans[take[i]] = 2;
      }
      for (int i = 0; i < n; i++) printf("%d ", ans[i]);
      cout << endl;
      exit(0);
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= min(n - 1, 10); i++) check(0, i);
  puts("NO");
  return 0;
}
