#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e7 + 1;
vector<int> spf(MAX);
void sieve() {
spf[1] = 1;
for (int i = 2; i < MAX; ++i) {
if (spf[i] == 0) {
spf[i] = i;
for (int j = i * 2; j < MAX; j += i) {
if (spf[j] == 0) spf[j] = i;
}
}
}
}
vector<int> factorize(int x) {
vector<int> res;
if (x == 1) return res;
while (x != 1) {
int p = spf[x];
res.push_back(p);
while (x % p == 0) x /= p;
}
return res;
}
struct DSU {
vector<int> parent, rank, parity;
DSU(int n) {
parent.resize(n);
rank.resize(n, 0);
parity.resize(n, 0);
for (int i = 0; i < n; ++i) parent[i] = i;
}
pair<int, int> find(int u) {
if (parent[u] != u) {
int p = parent[u];
auto [root, par] = find(p);
parent[u] = root;
parity[u] ^= par;
}
return {parent[u], parity[u]};
}
bool unite(int u, int v) {
auto [root_u, par_u] = find(u);
auto [root_v, par_v] = find(v);
if (root_u == root_v) {
return (par_u != par_v);
}
if (rank[root_u] < rank[root_v]) {
swap(root_u, root_v);
swap(par_u, par_v);
}
parent[root_v] = root_u;
parity[root_v] = (par_u == par_v) ? 1 : 0;
if (rank[root_u] == rank[root_v]) ++rank[root_u];
return true;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
sieve();
int n;
cin >> n;
vector<int> a(n);
for (auto &x : a) cin >> x;
map<int, vector<int>> prime_to_indices;
for (int i = 0; i < n; ++i) {
int x = a[i];
auto primes = factorize(x);
for (int p : primes) {
prime_to_indices[p].push_back(i);
}
}
for (auto &[p, indices] : prime_to_indices) {
if (indices.size() > 2) {
cout << -1 << endl;
return 0;
}
}
DSU dsu(n);
for (auto &[p, indices] : prime_to_indices) {
if (indices.size() == 2) {
int u = indices[0];
int v = indices[1];
if (!dsu.unite(u, v)) {
cout << -1 << endl;
return 0;
}
}
}
vector<int> group(n, 1);
for (int i = 0; i < n; ++i) {
auto [root, par] = dsu.find(i);
if (par == 1) {
group[i] = 2;
}
}
for (int g : group) {
cout << g << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYID0gMWU3ICsgMTsKCnZlY3RvcjxpbnQ+IHNwZihNQVgpOwoKdm9pZCBzaWV2ZSgpIHsKICAgIHNwZlsxXSA9IDE7CiAgICBmb3IgKGludCBpID0gMjsgaSA8IE1BWDsgKytpKSB7CiAgICAgICAgaWYgKHNwZltpXSA9PSAwKSB7CiAgICAgICAgICAgIHNwZltpXSA9IGk7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICogMjsgaiA8IE1BWDsgaiArPSBpKSB7CiAgICAgICAgICAgICAgICBpZiAoc3BmW2pdID09IDApIHNwZltqXSA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZlY3RvcjxpbnQ+IGZhY3Rvcml6ZShpbnQgeCkgewogICAgdmVjdG9yPGludD4gcmVzOwogICAgaWYgKHggPT0gMSkgcmV0dXJuIHJlczsKICAgIHdoaWxlICh4ICE9IDEpIHsKICAgICAgICBpbnQgcCA9IHNwZlt4XTsKICAgICAgICByZXMucHVzaF9iYWNrKHApOwogICAgICAgIHdoaWxlICh4ICUgcCA9PSAwKSB4IC89IHA7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgpzdHJ1Y3QgRFNVIHsKICAgIHZlY3RvcjxpbnQ+IHBhcmVudCwgcmFuaywgcGFyaXR5OwoKICAgIERTVShpbnQgbikgewogICAgICAgIHBhcmVudC5yZXNpemUobik7CiAgICAgICAgcmFuay5yZXNpemUobiwgMCk7CiAgICAgICAgcGFyaXR5LnJlc2l6ZShuLCAwKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgcGFyZW50W2ldID0gaTsKICAgIH0KCiAgICBwYWlyPGludCwgaW50PiBmaW5kKGludCB1KSB7CiAgICAgICAgaWYgKHBhcmVudFt1XSAhPSB1KSB7CiAgICAgICAgICAgIGludCBwID0gcGFyZW50W3VdOwogICAgICAgICAgICBhdXRvIFtyb290LCBwYXJdID0gZmluZChwKTsKICAgICAgICAgICAgcGFyZW50W3VdID0gcm9vdDsKICAgICAgICAgICAgcGFyaXR5W3VdIF49IHBhcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtwYXJlbnRbdV0sIHBhcml0eVt1XX07CiAgICB9CgogICAgYm9vbCB1bml0ZShpbnQgdSwgaW50IHYpIHsKICAgICAgICBhdXRvIFtyb290X3UsIHBhcl91XSA9IGZpbmQodSk7CiAgICAgICAgYXV0byBbcm9vdF92LCBwYXJfdl0gPSBmaW5kKHYpOwoKICAgICAgICBpZiAocm9vdF91ID09IHJvb3RfdikgewogICAgICAgICAgICByZXR1cm4gKHBhcl91ICE9IHBhcl92KTsKICAgICAgICB9CgogICAgICAgIGlmIChyYW5rW3Jvb3RfdV0gPCByYW5rW3Jvb3Rfdl0pIHsKICAgICAgICAgICAgc3dhcChyb290X3UsIHJvb3Rfdik7CiAgICAgICAgICAgIHN3YXAocGFyX3UsIHBhcl92KTsKICAgICAgICB9CgogICAgICAgIHBhcmVudFtyb290X3ZdID0gcm9vdF91OwogICAgICAgIHBhcml0eVtyb290X3ZdID0gKHBhcl91ID09IHBhcl92KSA/IDEgOiAwOwogICAgICAgIGlmIChyYW5rW3Jvb3RfdV0gPT0gcmFua1tyb290X3ZdKSArK3Jhbmtbcm9vdF91XTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIHNpZXZlKCk7CgogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIHZlY3RvcjxpbnQ+IGEobik7CiAgICBmb3IgKGF1dG8gJnggOiBhKSBjaW4gPj4geDsKCiAgICBtYXA8aW50LCB2ZWN0b3I8aW50Pj4gcHJpbWVfdG9faW5kaWNlczsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGludCB4ID0gYVtpXTsKICAgICAgICBhdXRvIHByaW1lcyA9IGZhY3Rvcml6ZSh4KTsKICAgICAgICBmb3IgKGludCBwIDogcHJpbWVzKSB7CiAgICAgICAgICAgIHByaW1lX3RvX2luZGljZXNbcF0ucHVzaF9iYWNrKGkpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGF1dG8gJltwLCBpbmRpY2VzXSA6IHByaW1lX3RvX2luZGljZXMpIHsKICAgICAgICBpZiAoaW5kaWNlcy5zaXplKCkgPiAyKSB7CiAgICAgICAgICAgIGNvdXQgPDwgLTEgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIERTVSBkc3Uobik7CgogICAgZm9yIChhdXRvICZbcCwgaW5kaWNlc10gOiBwcmltZV90b19pbmRpY2VzKSB7CiAgICAgICAgaWYgKGluZGljZXMuc2l6ZSgpID09IDIpIHsKICAgICAgICAgICAgaW50IHUgPSBpbmRpY2VzWzBdOwogICAgICAgICAgICBpbnQgdiA9IGluZGljZXNbMV07CiAgICAgICAgICAgIGlmICghZHN1LnVuaXRlKHUsIHYpKSB7CiAgICAgICAgICAgICAgICBjb3V0IDw8IC0xIDw8IGVuZGw7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB2ZWN0b3I8aW50PiBncm91cChuLCAxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgYXV0byBbcm9vdCwgcGFyXSA9IGRzdS5maW5kKGkpOwogICAgICAgIGlmIChwYXIgPT0gMSkgewogICAgICAgICAgICBncm91cFtpXSA9IDI7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGcgOiBncm91cCkgewogICAgICAgIGNvdXQgPDwgZyA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=