#include <iostream>;
#include <iomanip>;
#include <vector>;
#include <map>;
#include <stack>;
#include <cstdio>
#include <cstring>;
#include <algorithm>;
using namespace std;
int n,q,l,d,a[200005],resenje[200005],rezultat,poc,kraj;
struct slog{int l,d,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;
        poc=qw[1].l;
        kraj=qw[1].d;
        rezultat=a[qw[1].l];
        for(int k=qw[1].l+1;k<=qw[1].d;k++){
            rezultat=(rezultat&a[k]);
        }
        resenje[qw[1].poz]=rezultat;
//        printf("%d\n",rezultat);
    for(int i=2;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<=q;i++)printf("%d\n",resenje[i]);
return 0;
}