#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#include<ctime>
#include<random>
#include<set>
#include<map>
#if __cplusplus>=202002L
#include<ranges>
namespace vw=std::views;
#endif
#define siz(x) int((x).size())
#define cauto const auto
#define elif else if
#define all(x) std::begin(x),std::end(x)
#define rall(x) std::rbegin(x),std::rend(x)
#define fi first
#define se second
#define continue(x...) {x;continue;}
#define break(x...) {x;break;}
#define debug(x) #x" "<<(x)
using std::cin;using std::cout;
using std::max;using std::min;
using std::cerr;using std::clog;
using unt=unsigned;
using loli=long long;
using lolu=unsigned long long;
using pii=std::pair<int,int>;
using tiii=std::tuple<int,int,int>;
using bsi=std::basic_string<int>;
using bsc=std::string;
#if __cplusplus>=201402L
using std::operator""s;
#endif
#if __SIZEOF_POINTER__>=8
using venti=__int128_t;
using ventu=__uint128_t;
constexpr venti operator""_vt(lolu x){return venti(x);}
constexpr ventu operator""_uvt(lolu x){return ventu(x);}
#endif
template<typename T1,typename T2>constexpr T1&cmin(T1&x,T2&&y){if(y<x)x=y;return x;}
template<typename T1,typename T2>constexpr T1&cmax(T1&x,T2&&y){if(x<y)x=y;return x;}
template<typename T1,typename T2,typename...args>constexpr T1&cmin(T1&x,T2&&y,args&&...z){if(y<x)x=y;return cmin(x,std::forward<args>(z)...);}
template<typename T1,typename T2,typename...args>constexpr T1&cmax(T1&x,T2&&y,args&&...z){if(x<y)x=y;return cmax(x,std::forward<args>(z)...);}
template<typename T1,typename T2>constexpr T1 ceil(T1 x,T2 y){return x>0?(x+y-1)/y:x/y;}
template<typename T1,typename T2>constexpr T1 flor(T1 x,T2 y){return x>0?x/y:(x-y+1)/y;}
template<typename T>constexpr T&STLcls(T &x){T{}.swap(x);return x;}
[[maybe_unused]]struct{template<typename T>operator T(){T y;cin>>y;return y;}}tin;
struct _time{~_time(){cerr<<"\n\033[33;40m"<<1.*clock()/CLOCKS_PER_SEC<<"s\033[37;40m";}}_TM;
std::mt19937_64 rng(std::random_device{}());
constexpr int N=4e5+1;
int n,q,a[N],s[N],b0[N],nxt[N];
std::map<int,std::array<std::set<int>,2>>mp;
signed main(){
std::ios::sync_with_stdio(false);cin.tie(nullptr);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i],s[i]=s[i-1]^a[i],b0[i]=b0[i-1]+!!a[i],mp[s[i]][i&1].insert(i);
for(int l,r;q--;){
cin>>l>>r;
if(s[l-1]^s[r])continue(cout<<"-1\n")
if((r-l+1)&1){
if(b0[l-1]==b0[r])continue(cout<<"0\n")
else continue(cout<<"1\n")
}else{
if(a[l]==0){
if(b0[l]==b0[r])continue(cout<<"0\n")
else continue(cout<<"1\n")
}elif(a[r]==0){
if(b0[l-1]==b0[r-1])continue(cout<<"0\n")
else continue(cout<<"1\n")
}else{
if(*mp[s[l-1]][l&1].lower_bound(l)<r)continue(cout<<"2\n")
continue(cout<<"-1\n")
}
}
}
return 0;
}