T飞了的回滚莫队,求大佬查错
//
// main.cpp
// SP20644
//
// Created by mac on 2020/10/18.
//
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct cxk{
int l,r,id;
}q[500002];
int n,m;
int s[500002];
int rb[500002];
int be[500002];
int ma[1000002];
int mi[1000002];
int ans[500002];
int maxx;
int giao=0;
bool cmp(cxk a,cxk b)
{
if(be[a.l]!=be[b.l])return a.r<b.r;
return a.l<b.l;
}
inline void read(int &num)
{
int sign=1;
char c;
while((c=getchar())<'0'||c>'9')
if(c=='-')sign=-1;
num=c-'0';
while((c=getchar())>='0'&&c<='9')
num=(num<<1)+(num<<3)+c-'0';
num*=sign;
}
signed main( )
{
read(n);
read(m);
n++;
s[1]=n+1;
for(int i=2;i<=n;i++)
{
read(s[i]);
s[i]=s[i]+s[i-1];
}
/*int gn=sqrt(n);
int gnn=ceil((double)n/gn);
for(int i=1;i<=gnn;++i)
{
rb[i]=i*gn;
for(int j=i*gn-gn+1;j<=i*gn&&j<=n;j++)be[j]=i;
}
rb[gnn]=n;*/
int len=sqrt(n);
for(int i=1;i<=n;++i)be[i]=(i-1)/len+1;
for(int i=1;i<=len+1;++i)rb[i]=min(i*len,n);
for(int i=1;i<=m;++i)
{
read(q[i].l);
read(q[i].r );
q[i].r++;
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
int r=0;
int l=0;
int maxx=0;
int lastblock=0;
for(int i=1;i<=m;++i)
{
if(be[q[i].l]==be[q[i].r])
{
maxx=0;
for(int j=q[i].r;j>=q[i].l;--j)ma[s[j]]=0;
for(int j=q[i].r;j>=q[i].l;--j)
{
if(ma[s[j]]==0)ma[s[j]]=j;
else maxx=max(maxx,ma[s[j]]-j);
}
for(int j=q[i].r;j>=q[i].l;--j)ma[s[j]]=0;
ans[q[i].id]=maxx;
continue;
}
/* if(giao^be[q[i].l])
{
giao=be[q[i].l];
while(r>rb[giao])
{
ma[s[r]]=mi[s[r]]=0;
r--;
}
while(l<rb[giao]+1)
{
ma[s[l]]=mi[s[l]]=0;
l++;
}
maxx=0;
r=l-1;
}*/
if(lastblock^be[q[i].l])
{
while(r>rb[be[q[i].l]])
{
ma[s[r]]=mi[s[r]]=0;
--r;
}
while(l<rb[be[q[i].l]]+1)
{
ma[s[l]]=mi[s[l]]=0;
++l;
}
r=l-1;
maxx=0;
lastblock=be[q[i].l];
}
while(r<q[i].r)
{
++r;
if(mi[s[r]]==0)mi[s[r]]=ma[s[r]]=r;
else
{
ma[s[r]]=r;
maxx=max(maxx,r-mi[s[r]]);
}
}
int ll=l;
int res=maxx;
while(ll>q[i].l)
{
--ll;
if(!ma[s[ll]])ma[s[ll]]=ll;
else res=max(res,ma[s[ll]]-ll);
}
while(ll<l)
{
if(ma[s[ll]]==ll)ma[s[ll]]=0;
++ll;
}
ans[q[i].id]=res;
}
for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
return 0;
}