#include<bits/stdc++.h> using namespace std; #define N 300000 #define INF 0x3f3f3f3f int n,x,now,tp1,tp2,s1[N],s2[N],c[N],d[N],seg0[N],seg1[N],pos[N],col[N]; struct node{int v,i;}a[N]; bool cmpv(node p,node q){return p.v<q.v;} bool cmpi(node p,node q){return p.i<q.i;} #define ls (x<<1) #define rs (x<<1|1) void build(int x,int l,int r){ if (l==r){seg0[x]=a[l].v; seg1[x]=pos[l]; return;} int mid=(l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); seg0[x]=max(seg0[ls],seg0[rs]); seg1[x]=min(seg1[ls],seg1[rs]); } void del0(int x,int l,int r,int k){ if (l==r){seg0[x]=0; return;} int mid=(l+r)>>1; if (k<=mid) del0(ls,l,mid,k); else del0(rs,mid+1,r,k); seg0[x]=max(seg0[ls],seg0[rs]); } void del1(int x,int l,int r,int k){ if (l==r){seg1[x]=INF; return;} int mid=(l+r)>>1; if (k<=mid) del1(ls,l,mid,k); else del1(rs,mid+1,r,k); seg1[x]=min(seg1[ls],seg1[rs]); } int qry0(int x,int l,int r,int L,int R){ if (l>=L&&r<=R) return seg0[x]; int mid=(l+r)>>1,tmp=0; if (L<=mid) tmp=max(tmp,qry0(ls,l,mid,L,R)); if (R>mid) tmp=max(tmp,qry0(rs,mid+1,r,L,R)); return tmp; } int qry1(int x,int l,int r,int L,int R){ if (l>=L&&r<=R) return seg1[x]; int mid=(l+r)>>1,tmp=INF; if (L<=mid) tmp=min(tmp,qry1(ls,l,mid,L,R)); if (R>mid) tmp=min(tmp,qry1(rs,mid+1,r,L,R)); return tmp; } #undef ls #undef rs void dfs(int x,int w){ del0(1,1,n,x); del1(1,1,n,a[x].v); col[x]=w; if (c[a[x].v]>x){ int tmp; while ((tmp=qry0(1,1,n,x+1,c[a[x].v]))>a[x].v){ dfs(pos[tmp],3-w); } } if (d[x]<a[x].v){ int tmp; while ((tmp=qry1(1,1,n,d[x],a[x].v-1))<x) dfs(tmp,3-w); } } int main(){ scanf("%d",&n); now=1; for (int i=1;i<=n;i++){scanf("%d",&a[i].v); a[i].i=i; pos[a[i].v]=i;} sort(a+1,a+n+1,cmpv); int mx=0; for (int i=1;i<=n;i++){c[i]=max(c[i],mx); mx=max(mx,a[i].i);} sort(a+1,a+n+1,cmpi); memset(d,0x3f,sizeof d); int mn=INF; for (int i=n;i>=1;i--){d[i]=min(d[i],mn); mn=min(mn,a[i].v);} build(1,1,n); for (int i=1;i<=n;i++) if (!col[i]) dfs(i,1); int now=1; for (int i=1;i<=n;i++){ if (col[i]==1) s1[++tp1]=a[i].v; else s2[++tp2]=a[i].v; while (s1[tp1]==now||s2[tp2]==now){ if (s1[tp1]==now) tp1--; else tp2--; now++; } } if (now>n){ puts("TAK"); for (int i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",col[i]); } else puts("NIE"); return 0; }
|