提交时间:2024-07-19 16:19:47
运行 ID: 30495
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=3e6+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],ss[maxn];bool s[maxn]; int dfn[maxn],low[maxn],bel[maxn],scc,ct,stk[maxn],instk[maxn],tp; vector<int>v[maxn]; int hd[maxn],nxt[maxn],to[maxn],C; void lk(int x,int y){ ++C;nxt[C]=hd[x],hd[x]=C,to[C]=y; } int nbel[maxn]; int res[maxn]; int T[maxn]; int g(int x){ return ((1<<20)-1)^x; } void dfs(int u){ dfn[u]=low[u]=++ct,instk[u]=1,stk[++tp]=u; for(int x:v[u]){ if(!dfn[x])dfs(x),low[u]=min(low[u],low[x]); else if(instk[x])low[u]=min(low[u],dfn[x]); } if(dfn[u]==low[u]){ ++scc; while(tp){ int x=stk[tp--];bel[x]=scc;instk[x]=0; ss[scc]+=s[x]; if(x==u)break; } } } void slv(){ n=read();up(i,1,n)a[i]=read(),s[a[i]]=1; up(i,0,(1<<20)-1)if(s[i])v[i].p_b(g(i)); up(i,1,(1<<20)-1){ down(j,19,0){ if(!((i>>j)&1))continue; int nxt=i^(1<<j); v[i].p_b(nxt); } } up(i,0,(1<<20)-1)if(!dfn[i])dfs(i); down(i,n,1)if(ss[bel[a[i]]]==1)res[i]=a[i];else nbel[i]=bel[a[i]],lk(nbel[i],i); up(i,1,scc){ int tp=0,w=hd[i]; for(;w;w=nxt[w])T[tp++]=a[to[w]];w=hd[i]; sort(T,T+tp); for(int j=0;w;w=nxt[w],j++)res[to[w]]=T[j]; } up(i,1,n)printf("%d ",res[i]); }int main(){ // freopen("seq.in","r",stdin),freopen("seq.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }