#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

int main()
{
    long long n,k;
    cin >> n >> k;

    vector<long long> nesortiran(k);
    vector<long long> sortiran(k);
    for(long long i=0;i<k;i++)
    {
        cin >> nesortiran[i];
        sortiran[i]=nesortiran[i];
    }// mozda je moguce odrediti delioce pri unosu al meni to deluje tesko, vraticemo se da optimizujemo ako mora



    sort(sortiran.begin(), sortiran.end());// odmah ovde imam sve delioce
    // posle ovoga moram da napravim nacin da pamtim u prefiksu delioce svakog

    // jer realnost je da sadrzi delioce delioca, a posto vam je broj 10^18 meni je jasno da nema vajde racunati
    // tj k je 10^5 sto je apsurd da ja racunam
    map<long long, long long> izracunati;// e sad kako prolazimo kroz sortirani, inace bi isli od 1 opet al ovako koristimo prefikse
    // a sve moze na jednom posto trazimo za svaki jedan broj tj xor
    // a xor je isti bez obzira na redosled
    izracunati[1]=1;//

    for(long long i=1;i<k;i++)//sada za svaki racunam njegovu xor vrednost delilaca, i koristim prosle kao prefiks
    {// preskacem prvi jer prvi je 1
        izracunati[sortiran[i]]=1;// dajem mu za pocetak da je xor1
        for(long long j=1; j<= i;j++)// idem da pogledam svaki do trenutnog sortiranog, tj do korena
        {
            if(sortiran[i]%sortiran[j]==0)// ako je deljiv, pravimo xor
            {
                izracunati[sortiran[i]]=izracunati[sortiran[i]]^sortiran[j];// ovo je za svaki racunica, zato je i const
            }

        }// posto smo isli do korena a ne do broja samog moramo da dodamo i njega
        //izracunati[sortiran[i]]=izracunati[sortiran[i]]^sortiran[i];
    }

    for(long long i=0;i<k;i++)
    {
        cout << izracunati[nesortiran[i]] << " ";
    }
    return 0;
}