#include <iostream>;
#include <iomanip>;
#include <vector>;
#include <map>;
#include <stack>;
#include <cstdio>
#include <cstring>;
#include <algorithm>;
using namespace std;
int n,q,l,polje,pok,d,a[200005],resenje[200005],rezultat,poc,kraj,duzina[200000];
struct slog{int l;int d; int poz;};
slog qw[200000];
bool cmp(slog a,slog b){
    return a.l<b.l or (a.l==b.l and a.d<b.d);
}
int main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=q;i++){
        scanf("%d %d",&qw[i].l,&qw[i].d);
        qw[i].poz=i;
    }
    sort(qw+1,qw+1+q,cmp);
   // for(int i=1;i<=q;i++)cout<<qw[i].l<<"  "<<qw[i].d<<endl;
    pok=1;
    while(polje<n){
        polje++;
        while(true){
            if(qw[pok].l==polje){
                //cout<<"qw["<<pok<<"].l="<<qw[pok].l<<"  polje="<<polje;
                resenje[pok]=a[polje];
                duzina[pok]=qw[pok].d-qw[pok].l+1;
           //     cout<<"  duzina="<<duzina[pok]<<endl;
                pok++;
            }
            else break;
        }
        //cout<<"polje="<<polje<<endl;
        for(int i=1;i<pok;i++){
            if(duzina[i]>0){
                resenje[i]=resenje[i]&a[polje];
                duzina[i]--;
                }
        //    cout<<"  resenje["<<i<<"]="<<resenje[i]<<"  duzina["<<i<<"]="<<duzina[i]<<endl;
        }
    }

//    for(int i=1;i<=q;i++){
//        if(poc==qw[i].l){
//            for(int k=kraj+1;k<=qw[i].d;k++){
//                rezultat=(rezultat&a[k]);
//            }
//            resenje[qw[i].poz]=rezultat;
//            //printf("%d\n",rezultat);
//        }
//        else {
//            poc=qw[i].l;
//            kraj=qw[i].d;
//            rezultat=a[qw[i].l];
//            for(int k=qw[i].l+1;k<=qw[i].d;k++){
//                rezultat=(rezultat&a[k]);
//            }
//            resenje[qw[i].poz]=rezultat;
//            //printf("%d\n",rezultat);
//        }
//    }
    for(int i=1;i<pok;i++)printf("%d\n",resenje[qw[i].poz]);
return 0;
}