翻了半天讨论版感觉只有我被卡常了
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int n,m,a[500005],belong[500005],block_l[750],block_r[750],f[750][750];
int len,t[500005],id[500005],ans;
vector<int>v[500005];
void build()
{
for(int i=1;i<=len;i++)
{
block_l[i]=(i-1)*len+1;
block_r[i]=i*len;
for(int j=block_l[i];j<=block_r[i];j++)
belong[j]=i;
}
int cnt=len;
if(block_r[len]!=n)
{
cnt++;
block_l[len+1]=len*len+1;
block_r[len+1]=n;
for(int i=block_l[len+1];i<=block_r[len+1];i++)
belong[i]=len+1;
}
for(int i=1;i<=cnt;i++)
{
for(int j=i;j<=cnt;j++)
{
int cnt_Max=f[i][j-1];
for(int k=block_l[j];k<=block_r[j];k++)
cnt_Max=max(cnt_Max,++t[a[k]]);
}
for(int k=block_l[i];k<=n;k++)
t[a[k]]=0;
}
}
int ask(int l,int r)
{
int idl=belong[l],idr=belong[r];
if(idr-idl<=1)
{
int cnt=0;
int i;
for(i=l;i+7<=r;i+=8)
{
cnt=max(cnt,++t[a[i]]);
cnt=max(cnt,++t[a[i+1]]);
cnt=max(cnt,++t[a[i+2]]);
cnt=max(cnt,++t[a[i+3]]);
cnt=max(cnt,++t[a[i+4]]);
cnt=max(cnt,++t[a[i+5]]);
cnt=max(cnt,++t[a[i+6]]);
cnt=max(cnt,++t[a[i+7]]);
}
while(r-i+1)
{
cnt=max(cnt,++t[a[i]]);
i++;
}
for(i=l;i+7<=r;i+=8)
{
t[a[i]]--;
t[a[i+1]]--;
t[a[i+2]]--;
t[a[i+3]]--;
t[a[i+4]]--;
t[a[i+5]]--;
t[a[i+6]]--;
t[a[i+7]]--;
}
while(r-i+1)
{
t[a[i]]--;
i++;
}
return cnt;
}
int cnt=f[idl+1][idr-1];
for(int i=l;i<=block_r[idl];i++)
{
while(id[i]+ans<(int)(v[a[i]].size())&&v[a[i]][id[i]+ans]<=r)
cnt++;
}
for(int i=block_l[idr];i<=r;i++)
{
while(id[i]-ans>=0&&v[a[i]][id[i]-ans]>=l)
cnt++;
}
return cnt;
}
int main()
{
// freopen("Ynoi.in","r",stdin);
// freopen("test.out","w",stdout);
// scanf("%d%d",&n,&m);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
len=sqrt(n);
for(int i=1;i<=n;i++)
{
// scanf("%d",&a[i]);
cin>>a[i];
v[a[i]].push_back(i);
id[i]=v[a[i]].size()-1;
}
while(m--)
{
int l,r;
// scanf("%d%d",&l,&r);
cin>>l>>r;
l^=ans,r^=ans;
if(l>r)
swap(l,r);
ans=ask(l,r);
cout<<ans;
// printf("%d\n",ans);
}
return 0;
}