调了一天了—— 唉—— 可以帮忙看看吗?
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5,B=205;
int n,m,cnt=0,f[B][B],p[B][N];
int bl,tot,L[B],R[B],id[N],t[N];
struct node
{
int x,y,d;
}a[N];
bool cmp2(node a,node b)
{
return a.d<b.d;
}
bool cmp1(node a,node b)
{
return a.x<b.x;
}
int ans[N];
int query(int l,int r)
{
int ql=id[l],qr=id[r];
if(qr-ql<=2)
{
for(int i=l;i<=r;i++)
{
t[a[i].y]=0;
}
int sum=0,ad;
for(int i=l;i<=r;i++)
{
t[a[i].y]++;
if(t[a[i].y]>sum)
{
sum=t[a[i].y];
ad=a[i].y;
}
else if(t[a[i].y]==sum)
{
sum=t[a[i].y];
ad=min(ad,a[i].y);
}
}
return ans[ad];
}
memset(t,0,sizeof t);
int ad;
int mx=0;
for(int i=l;i<=R[ql];i++)
{
t[a[i].y]++;
int sum=p[qr-1][a[i].y]-p[ql][a[i].y];
if(t[a[i].y]+sum>mx)
{
mx=t[a[i].y]+sum;
ad=a[i].y;
}
else if(t[a[i].y]+sum==mx)
{
mx=t[a[i].y]+sum;
ad=min(ad,a[i].y);
}
}
for(int i=L[qr];i<=r;i++)
{
t[a[i].y]++;
int sum=p[qr-1][a[i].y]-p[ql][a[i].y];
if(t[a[i].y]+sum>mx)
{
mx=t[a[i].y]+sum;
ad=a[i].y;
}
else if(t[a[i].y]+sum==mx)
{
mx=t[a[i].y]+sum;
ad=min(ad,a[i].y);
}
}
memset(t,0,sizeof t);
int add=f[ql+1][qr-1];
if(mx<p[qr-1][add]-p[ql][add])ad=add;
return ans[ad];
}
int main()
{
scanf("%d%d",&n,&m);
bl=sqrt(n);
tot=(n-1)/bl+1;
for(int i=1;i<=n;i++)
{
id[i]=(i-1)/bl+1;
scanf("%d",&a[i].x);
a[i].d=i;
}
sort(a+1,a+n+1,cmp1);
int cnt=0;
a[0].x=n+1;
for(int i=1;i<=n;i++)
{
if(a[i].x!=a[i-1].x)
{
cnt++;
}
a[i].y=cnt;
ans[cnt]=a[i].x;
}
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=tot;i++)
{
L[i]=R[i-1]+1;
R[i]=(i==tot?n:i*bl);
}
for(int i=1;i<=tot;i++)
{
memset(t,0,sizeof t);
int mx=0,ad;
for(int j=i;j<=tot;j++)
{
for(int k=L[j];k<=R[j];k++)
{
t[a[k].y]++;
if(t[a[k].y]>mx)
{
mx=t[a[k].y];
ad=a[i].y;
}
else if(t[a[k].y]==mx)
{
mx=t[a[k].y];
ad=min(ad,a[i].y);
}
}
f[i][j]=ad;
}
memset(t,0,sizeof t);
}
for(int i=1;i<=tot;i++)
{
for(int j=1;j<=n;j++)p[i][j]=p[i-1][j];
for(int j=L[i];j<=R[i];j++)
{
p[i][a[j].y]++;
}
}
int lst=0;
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
l=((l+lst-1)%n)+1;
r=((r+lst-1)%n)+1;
if(l>r)swap(l,r);
lst=query(l,r);
cout<<lst<<'\n';
}
return 0;
}