参考代码:

#include<bits/stdc++.h>
#define read() Read<int>()
namespace pb_ds{   
    namespace io{
        const int MaxBuff=1<<15;
        const int Output=1<<23;
        char B[MaxBuff],*S=B,*T=B;
        #define getc() ((S==T)&&(T=(S=B)+fread(B,1,MaxBuff,stdin),S==T)?0:*S++)
        char Out[Output],*iter=Out;
        inline void flush(){
            fwrite(Out,1,iter-Out,stdout);
            iter=Out;
        }
    }
    template<class Type> inline Type Read(){
        using namespace io;
        register char ch;
        register Type ans=0; 
        register bool neg=0;
        while(ch=getc(),(ch<'0' || ch>'9') && ch!='-');
        ch=='-'?neg=1:ans=ch-'0';
        while(ch=getc(),'0'<= ch && ch<='9') ans=ans*10+ch-'0';
        return neg?-ans:ans;
    }
    template<class Type> inline void Print(register Type x,register char ch='\n'){
        using namespace io;
        if(!x) *iter++='0';
        else{
            if(x<0) *iter++='-',x=-x;
            static int s[100]; 
            register int t=0;
            while(x) s[++t]=x%10,x/=10;
            while(t) *iter++='0'+s[t--];
        }
        *iter++=ch;
    }
}
using namespace pb_ds;
using namespace std;
typedef long long ll;
const int N=5e5+5;
const int M=(1<<20)+5;
int n,q,pos;
int las[M],s[N];
int pre[N],rk[N];
int ans[N];
inline bool cmp(int x,int y){
    return pre[x]>pre[y];
}
struct node{
    int l,r,id;
    inline bool operator < (const node &u)const{
        return l>u.l;
    }
}a[N];
namespace bit{
    #define lowbit(x) (x&(-x))
    int sss[N];
    inline void init(){
        memset(sss,63,sizeof(sss));
    }
    inline void add(int x,int k){
        for (int i=x+1;i<=n+1;i+=lowbit(i))
            sss[i]=min(sss[i],k);
    }
    inline int query(int x){
        int res=n+1;
        for (int i=x+1;i;i-=lowbit(i))
            res=min(sss[i],res);
        return res;
    }
}
using namespace bit;
int main(){
    //freopen("a.in","r",stdin);
    n=read(),q=read();
    for (int i=1;i<=n;++i)
        s[i]=s[i-1]^read();
    memset(pre,-1,sizeof(pre));
    memset(las,-1,sizeof(las));
    for (int i=0;i<=n;++i)
        pre[i]=las[s[i]],las[s[i]]=i,rk[i]=i;
    for (int i=1;i<=q;++i)
        a[i].l=read(),a[i].r=read(),a[i].id=i;
    sort(a+1,a+q+1),sort(rk,rk+n+1,cmp);
    init();
    for (int i=1;i<=q;++i){
        while (pos<=n && pre[rk[pos]]>=a[i].l-1)
            add(rk[pos],rk[pos]-pre[rk[pos]]),++pos;
        ans[a[i].id]=query(a[i].r);
        if (ans[a[i].id]>n) ans[a[i].id]=-1;
    }
    for (int i=1;i<=q;++i)
        printf("%d\n",ans[i]);
    return 0;
}