//为了使最大值最小,每次选最大值&&把最大值不断除以2 碰到!vis[x']时停止,x'为0说明最值无法变化,退出即可
//x>y x'<y时 y此时为最大值 为了使最大值最小 x'在变小没有意义,反而可能会增大最大值(x'/2=y/2的情况)
// x'>y时 下一步时会继续对x'进行操作,进一步缩小最大值
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <map>
using namespace std;
const int N=5e5+20;
priority_queue<long> q;
map<int,int> vis;
//为了使最大值最小,每次选最大值&&把最大值不断除以2 碰到!vis[x']时停止
//x>y x'<y时 y此时为最大值 为了使最大值最小 x'在变小没有意义,反而可能会增大最大值(x'/2=y/2的情况)
// x'>y时 下一步时会继续对x'进行操作,进一步缩小最大值
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
vis[x]=1;
q.push(x);
}
while(1)
{
int x=q.top();
int t=x;
while(vis[x]&&x!=0)
x/=2;
if(x==0)
break;
q.push(x);
q.pop();
vis[t]=0;
vis[x]=1;
}
while(!q.empty())
{
long x=q.top();
q.pop();
cout<<x<<" ";
}
return 0;
}