rt,P4168 区间众数,夹杂着 RE 与 WA
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10,M=2e3;
int n,q,a[N],b[N],c,pos[N],f[M][M],s[M][N],t[N],cnt;
struct node{
int l,r,len;
} k[M];
vector<int> v;
int query(int l,int r){
v.clear();
if(pos[r]-pos[l]>1){
v.push_back(f[pos[l]+1][pos[r]-1]);
}
for(int i=l;i<=min(k[pos[l]].r,r);i++){
v.push_back(a[i]);
t[a[i]]++;
}
if(pos[l]!=pos[r]){
for(int i=k[pos[r]].l;i<=r;i++){
v.push_back(a[i]);
t[a[i]]++;
}
}
int mx=0,ans=2e9;
for(int val:v){
int cc=(s[pos[r]-1][val]-s[pos[l]][val])*(pos[l]!=pos[r])+t[val];
if(mx<=cc){
if(mx==cc){
ans=min(ans,val);
}else{
ans=val;
}
mx=cc;
}
t[val]=0;
}
return ans;
}
int main(){
cin >>n>>q;
for(int i=1;i<=n;i++){
cin >>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
int l=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+l+1,a[i])-b;
}
while(c*c*c<=n*n){
c++;
}
c--;
c=max(1,c);
int p=0;
for(int i=1;i<=n/c;i++){
cnt++;
k[cnt].l=p+1;
for(int j=1;j<=c;j++){
p++;
pos[p]=cnt;
}
k[cnt].r=p;
k[cnt].len=k[cnt].r-k[cnt].l+1;
}
if(p!=n){
cnt++;
k[cnt].l=p+1;
k[cnt].r=n;
k[cnt].len=k[cnt].r-k[cnt].l+1;
}
for(int i=1;i<=cnt;i++){
for(int j=1;j<=l;j++){
s[i][j]=s[i-1][j];
}
for(int j=k[i].l;j<=k[i].r;j++){
s[i][a[j]]++;
}
}
for(int i=1;i<=cnt;i++){
for(int j=i;j<=cnt;j++){
int mx=0;
f[i][j]=max(f[i][j],f[i][j-1]);
for(int k=1;k<=l;k++){
if(mx<s[j][k]-s[i-1][k]){
mx=s[j][k]-s[i-1][k];
f[i][j]=k;
}
}
}
}
int x=0;
while(q--){
int l,r;
cin >>l>>r;
l=(l+x-1)%n+1;
r=(r+x-1)%n+1;
if(l>r){
swap(l,r);
}
x=query(l,r);
cout <<b[x]<<endl;
}
return 0;
}