#include <bits/stdc++.h>
using namespace std;
vector <long long> A,t,res;
long long a,N,brvr;
long long v[2000006],sol[2000005];
struct p{
    long long ind,vr;
};
p niz[2000007];
vector <int> m;
bool cmp(p A, p B){
    return A.vr<B.vr;
}
bool vrati(p A, p B){
    return A.ind<B.ind;
}
bool svistepeni(){
    for(int i=1;i<=N;i++){
        long long a=niz[i].vr;
        while(a){
            if(a==1){
                break;
            }
            if(a%2){
                return false;
            }
            a/=2;
        }
    }
    return true;
}
bool parnapojav(){
    for(int i=1;i<=N;i++){
        v[i]=0;
    }
    brvr=0;
    for(int i=1;i<=N;i++){
        if(niz[i].vr!=niz[i-1].vr){
            brvr++;
            v[brvr]++;
        }
        else{
            v[brvr]++;
        }
    }
    for(int i=1;i<=brvr;i++){
        if(v[i]%2)
            return false;
    }
    return true;
}
vector<long long> solve(vector<int> A){
    N=A.size();
    for(int i=1;i<=N;i++){
        niz[i].ind=i;
        niz[i].vr=A[i-1];
    }
    sort(niz+1,niz+1+N,cmp);
    if(parnapojav()){ ///GOTOV
        ///1)
        int k=1;
        for(int i=1;i<=N;i++){
            if(i%2){
                sol[k]=niz[i].ind;
            }
            else{
                sol[N-k+1]=niz[i].ind;
                k++;
            }
        }
        for(int i=1;i<=N;i++){
            res.push_back(sol[i]-1);
        }
    }
    else if(svistepeni()){
        ///2) i 3)
        ///cout << "kkk\n";
        if(N<=25){ ///gotov
            for(int i=0;i<N;i++){
                res.push_back(i);
            }
            if(N%2)
                swap(res[N/2],res[N-1]);
            else
                swap(res[N/2-1],res[N-1]);
        }
        else{


        }
    }

    else if(N<=7){

    }
    else{

    }
    return res;
}
