RT
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int a[1000005];
int s[1000005];
int f[1000005];
int bl[1000005];
int maxn[1000005],minn[1000005];
int tmaxn[1000005],tminn[1000005];
int bmaxn[1000005],bminn[1000005];
vector<int>use;
int ans=0;
struct node{
int l,r,id,ans;
}ask[1000005];
void add(int t,int fl){
if(fl){
tmaxn[s[t]]=max(tmaxn[s[t]],t);
if(tminn[s[t]]==-1)tminn[s[t]]=t;
else tminn[s[t]]=min(tminn[s[t]],t);
}
maxn[s[t]]=max(maxn[s[t]],t);
if(minn[s[t]]==-1)minn[s[t]]=t;
else minn[s[t]]=min(minn[s[t]],t);
ans=max(ans,maxn[s[t]]-minn[s[t]]);
// cout<<s[t]<<' '<<maxn[s[t]]<<" "<<minn[s[t]]<<' '<<ans<<endl;
}
int blsiz;
bool cmp(node a,node b){
if(bl[a.l]==bl[b.l])return a.r<b.r;
return a.l<b.l;
}
bool Cmp(node a,node b){
return a.id<b.id;
}
signed main(){
ios::sync_with_stdio(false);
int n,q;
cin>>n>>q;
blsiz=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
bl[i]=(i+(int)(sqrt(n))-1)/(int)(sqrt(n));
s[i]=s[i-1]+a[i];
}
// for(int i=1;i<=n;i++){
// cout<<bl[i]<<" ";
// }
// cout<<endl;
for(int i=0;i<=n;i++){
s[i]+=100000;
}
// for(int i=1;i<=n;i++){
// cout<<s[i]<<' ';
// }
// cout<<endl;
memset(minn,-1,sizeof(minn));
memset(tminn,-1,sizeof(tminn));
// tminn[100000]=0;
// minn[0]=0;
// int l=1,r=0,nowbl=0;
for(int i=1;i<=q;i++){
cin>>ask[i].l>>ask[i].r;
// ask[i].l--;
ask[i].id=i;
}
sort(ask+1,ask+q+1,cmp);
int l=1,r=0,nowbl=-1,nowl,tans;
for(int i=1;i<=q;i++){
// cout<<ask[i].l<<" "<<bl[ask[i].l]<<" "<<ask[i].r<<endl;
if(bl[ask[i].l]==bl[ask[i].r]){
// cout<<"DOOM"<<ask[i].l<<" "<<ask[i].r<<endl;
// cout<<"DOOM\n";
for(int j=ask[i].l-1;j<=ask[i].r;j++){
bmaxn[s[j]]=bminn[s[j]]=-1;
}
int cnt=0;
for(int j=ask[i].l-1;j<=ask[i].r;j++){
bmaxn[s[j]]=max(bmaxn[s[j]],j);
if(bminn[s[j]]==-1)bminn[s[j]]=j;
}
for(int j=ask[i].l-1;j<=ask[i].r;j++){
cnt=max(cnt,bmaxn[s[j]]-bminn[s[j]]);
}
ask[i].ans=cnt;
continue;
}
if(bl[ask[i].l]!=nowbl){
ans=0;
use.clear();
for(int i=max(0,nowl-(int)sqrt(n));i<=r;i++){
tmaxn[s[i]]=tminn[s[i]]=maxn[s[i]]=minn[s[i]]=-1;
}
nowbl=bl[ask[i].l];
nowl=bl[ask[i].l]*(int)(sqrt(n));
l=nowl,r=nowl-1;
while(r<ask[i].r){
// cout<<r<<" "<<ask[i].r<<" "<<tans<<endl;
add(++r,1);
}
tans=ans;
// cout<<l<<" "<<r<<" "<<nowl<<endl;
// cout<<tans<<endl;
// cout<<tans<<' '<<endl;
}
// for(int i=100000;i<=100001;i++){
// cout<<tmaxn[i]<<" "<<maxn[i]<<"-"<<tminn[i]<<" "<<minn[i]<<" ";
// }
// cout<<endl;
ans=tans;
l=nowl;
while(r<ask[i].r){
add(++r,1);
}
while(l>ask[i].l-1){
// cout<<l<<"-"<<ask[i].l<<endl;
use.push_back(--l);
add(l,0);
}
// cout<<l<<" "<<r<<" "<<tans<<" "<<ans<<" "<<nowl<<endl;
// cout<<tans<<" "<<ans<<endl<<endl;
ask[i].ans=ans;
while(!use.empty()){
// cout<<s[use[use.size()-1]]<<endl;
maxn[s[use[use.size()-1]]]=tmaxn[s[use[use.size()-1]]];
minn[s[use[use.size()-1]]]=tminn[s[use[use.size()-1]]];
use.pop_back();
}
// while(ask)
}
sort(ask+1,ask+q+1,Cmp);
for(int i=1;i<=q;i++)cout<<ask[i].ans<<endl;
return 0;
}
/*
5 1
-1 1 -1 1 -1
1 3
*/