和bzoj4059一样的套路。
#include<bits/stdc++.h>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void Read(int& x){
char c=nc();
for(;c<'0'||c>'9';c=nc());
for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
const int N=1000010;
const int M=10000010;
int k,n,m,mx;
int p[M],num,f[M];
int c[M];
int a[N],lst[N],nxt[N];
int Ans[N];
bool b[M];
inline void Init(){
for(int i=2;i<=mx;i++){
if(!b[i])p[++num]=i;
int t;
for(int j=1;j<=num&&(t=p[j]*i)<=mx;j++){
b[t]=1;f[t]=p[j];
if(!(i%p[j]))break;
}
}
}
bool Solve(int l,int r,int x){
if(l>=r){
if(l==r)Ans[l]=x;
return 1;
}
int p1=l,p2=r;
bool b=0;
while(p1<=p2){
if(b){
if(lst[p1]<l&&nxt[p1]>r){
Ans[p1]=x;
return Solve(l,p1-1,p1)&&Solve(p1+1,r,p1);
}
p1++;
}else{
if(lst[p2]<l&&nxt[p2]>r){
Ans[p2]=x;
return Solve(l,p2-1,p2)&&Solve(p2+1,r,p2);
}
p2--;
}
b^=1;
}
return 0;
}
int main(){
Read(n);
for(int i=1;i<=n;i++)Read(a[i]),mx=max(mx,a[i]);
Init();
for(int i=1;i<=n;i++){
int j=a[i];
if(j==1)continue;
for(;f[j];j/=f[j])lst[i]=max(lst[i],c[f[j]]);
lst[i]=max(lst[i],c[j]);
for(j=a[i];f[j];j/=f[j])c[f[j]]=i;c[j]=i;
}
memset(c,0,sizeof(c));
for(int i=n;i;i--){
nxt[i]=n+1;
int j=a[i];
if(j==1)continue;
for(;f[j];j/=f[j])if(c[f[j]])nxt[i]=min(nxt[i],c[f[j]]);
if(c[j])nxt[i]=min(nxt[i],c[j]);
for(j=a[i];f[j];j/=f[j])c[f[j]]=i;c[j]=i;
}
if(Solve(1,n,0)){
for(int i=1;i<=n;i++)printf("%d ",Ans[i]);
}else puts("impossible");
return 0;
}