RT,WA on #5
#include<cstdio>
#define ll long long
using namespace std;
const int N=2e5+5;
int t,n,cnt,wz[N],L[N];
ll a[N],m2[40];
bool F;
void Spec(){
for(int i=wz[1]-1;i>=1;--i){
a[i]=a[i+1]*2ll;
if(a[i]>114514) a[i]=a[i+1]/2ll;
}
for(int i=wz[cnt]+1;i<=n;++i){
a[i]=a[i-1]*2ll;
if(a[i]>114514) a[i]=a[i-1]/2ll;
}
}
int find(ll x){
for(int i=0;i<=35;++i)
if(x<m2[i]) return i;
}
ll num,num1,num2;
int lm,no,nwz,nr;
void Work1(int s){
int cmin=0;
num=a[wz[s]];
nwz=wz[s];
for(int i=L[s];i>L[s+1];--i){
num/=2ll;++cmin;++nwz;
a[nwz]=num;
}
if(cmin>(wz[s+1]-wz[s])){
F=true;
return ;
}
num1=num;num2=a[wz[s+1]];
no=0;lm=0;
while(num1!=0){
++no;
if((num1%2ll)!=(num2%2ll)) lm=no;
num1/=2ll;num2/=2ll;
}
cmin+=lm*2;
if(cmin>(wz[s+1]-wz[s])){
F=true;
return ;
}
num1=num;num2=a[wz[s+1]];
for(int i=1;i<=lm;++i){
++nwz;
num1/=2ll;
a[nwz]=num1;
}
nr=wz[s+1];
for(int i=1;i<=lm;++i){
num2/=2ll;
--nr;
a[nr]=num2;
}
if((nr-nwz)%2!=0){
F=true;
return ;
}
for(int i=nwz+1;i<nr;i+=2){
a[i]=a[i-1]*2ll;
a[i+1]=a[i-1];
if(a[i-1]*2ll>114514){
a[i]=a[i-1]/2ll;
a[i+1]=a[i-1];
}
}
}
void Work2(int s){
int cmin=0;
num=a[wz[s+1]];
nwz=wz[s+1];
for(int i=L[s+1];i>L[s];--i){
num/=2ll;++cmin;--nwz;
a[nwz]=num;
}
if(cmin>(wz[s+1]-wz[s])){
F=true;
return ;
}
num1=num;num2=a[wz[s]];
no=0;lm=0;
while(num1!=0){
++no;
if((num1%2ll)!=(num2%2ll)) lm=no;
num1/=2ll;num2/=2ll;
}
cmin+=lm*2;
if(cmin>(wz[s+1]-wz[s])){
F=true;
return ;
}
num1=num;num2=a[wz[s]];
for(int i=1;i<=lm;++i){
--nwz;
num1/=2ll;
a[nwz]=num1;
}
nr=wz[s];
for(int i=1;i<=lm;++i){
num2/=2ll;
++nr;
a[nr]=num2;
}
if((nwz-nr)%2!=0){
F=true;
return ;
}
for(int i=nr+1;i<nwz;i+=2){
a[i]=a[i-1]*2ll;
a[i+1]=a[i-1];
if(a[i-1]*2ll>114514){
a[i]=a[i-1]/2ll;
a[i+1]=a[i-1];
}
}
}
int main(){
scanf("%d",&t);
m2[0]=1;
for(int i=1;i<=35;++i)
m2[i]=m2[i-1]*2ll;
while(t--){
scanf("%d",&n);
cnt=0;
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
if(a[i]!=-1){
wz[++cnt]=i;
L[cnt]=find(a[i]);
}
}
if(cnt==0){
for(int i=1;i<=n;++i){
if(i%2==0) printf("1 ");
else printf("2 ");
}
printf("\n");
continue;
}
Spec();
F=false;
for(int i=1;i<cnt;++i){
if(wz[i]+1==wz[i+1]){
if((a[wz[i]]!=a[wz[i+1]]/2ll)&&(a[wz[i]]/2ll!=a[wz[i+1]])){
F=true;
break;
}
continue;
}
if(a[wz[i]]>=a[wz[i+1]]) Work1(i);
else Work2(i);
if(F) break;
}
if(F){
printf("-1\n");
continue;
}
for(int i=1;i<=n;++i)
printf("%lld ",a[i]);
printf("\n");
}
return 0;
}