提交时间:2024-07-19 15:56:40

运行 ID: 30469

#include <bits/stdc++.h> // #pragma GCC optimize("Ofast,unroll-loops,inline") using namespace std; // #pragma GCC optimize(3) // #define int long long #define endl "\n" namespace fasti{ char buf[1<<21],*p1=buf,*p2=buf; inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*(p1++);} inline void read(int&x){ char c=getc(),f=0; for(;!isdigit(c);c=getc())f^=!(c^'-'); for(x=0;isdigit(c);c=getc())x=x*10+(c^48); if(f)x=-x;--p1; } template<typename... Args> inline void read(int&x,Args&...args){read(x),read(args...);} } using fasti::getc; using fasti::read; namespace fasto{ char obuf[1<<21],stk[20];int o_p=-1,tp; inline void flush(){fwrite(obuf,1,o_p+1,stdout),o_p=-1;} inline void print(char c){if(o_p==(1<<21)-1)flush();obuf[++o_p]=c;} void print(int x){ for(stk[tp=0]=x%10;x>9;stk[++tp]=x%10)x/=10; for(;~tp;)print((char)(stk[tp--]|48)); } template<typename T,typename... Args> void print(T x,Args... args){print(x),print(args...);} } using fasto::flush; using fasto::print; int n; int a[2100300]; vector<int>g[2100300]; vector<int>loc[2100300]; vector<int>w[2100300]; const int N=(1<<20)-1; const int LG=20; int dfn[2100300],low[2100300]; int tp; int tk=0,cnt=0; int bel[2100300]; int S[2100300]; int hd[2100000]; bool inst[2100000],vis[2100000]; struct node{int v,nxt;}E[1000030*20+2000000]; int ec=0; inline void ins(int u,int v){ ++ec; E[ec]={v,hd[u]}; hd[u]=ec; } inline void mn(int &x,int y){ if(x>y)x=y; } inline void dfs(int &u){ dfn[u]=low[u]=++tk; S[++tp]=u; inst[u]=vis[u]=1; for(int i=hd[u];i;i=E[i].nxt){ int v=E[i].v; if(!vis[v])dfs(v),mn(low[u],low[v]); else if(inst[v])mn(low[u],dfn[v]); } if(dfn[u]==low[u]){ ++cnt; while(tp){ int x=S[tp]; tp--; inst[x]=0; bel[x]=cnt; if(x==u)break; } } } signed main(){ ios::sync_with_stdio(0); // freopen("seq.in","r",stdin); // freopen("seq.out","w",stdout); for(int i=1;i<=N;i++) for(int j=0;j<LG;j++) if((i>>j)&1) ins(i,i^(1<<j)); read(n); for(int i=1;i<=n;i++) read(a[i]); for(int i=1;i<=n;i++) ins(i+N,N^a[i]),ins(a[i],N+i); int p=N; dfs(p); for(int i=1;i<=n;i++) loc[bel[i+N]].emplace_back(i), w[bel[i+N]].emplace_back(a[i]); // return 0; for(int i=1;i<=cnt;i++){ sort(w[i].begin(),w[i].end()); int k=loc[i].size(); for(int j=0;j<k;j++) a[loc[i][j]]=w[i][j]; } // return 0; for(int i=1;i<=n;i++)print(a[i]); flush(); cout.flush(); return 0; }