斋藤飞鸟 @ 2018-12-11 18:06:38
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#define LL long long
using namespace std;
void read(int &n){
int num=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
num=num*10+ch-'0';
ch=getchar();
}
n=num*w;
}
const int maxn=4e5+5,maxk=550;
int a[maxn];
int blo,bl[maxn];
int n,m;
int id=0,v[maxn];
int f[maxk][maxk],fnum[maxk][maxk],cnt[maxn];
map <int,int> mp;
void init(){//读入预处理
read(n);read(m);
blo=sqrt(n);
for(int i=1;i<=n;i++){
read(a[i]);
bl[i]=(i-1)/blo+1;
/*离散化*/
if(mp.find(a[i])==mp.end()){
id++;
mp[a[i]]=id;
v[id]=a[i];
}
a[i]=mp[a[i]];
}
}
void init2(){//块 预处理
for(int i=1;i<=n;i+=blo){
memset(cnt,0,sizeof(cnt));
int zs=-1,zsnum=-1;
for(int j=i;j<=n;j++){
cnt[a[j]]++;
if(cnt[a[j]]>zsnum || cnt[a[j]]==zsnum && v[a[j]]<v[zs]){
zs=a[j];
zsnum=cnt[a[j]];
}
f[bl[i]][bl[j]]=zs;
fnum[bl[i]][bl[j]]=zsnum;
}
}
}
int query(int x,int y){
memset(cnt,0,sizeof(cnt));
/*暴力处理两边*/
//左边
for(int i=x;i<=min(y,bl[x]*blo);i++)
cnt[a[i]]++;
//右边
if(bl[x]!=bl[y])
for(int i=(bl[y]-1)*blo+1;i<=y;i++)
cnt[a[i]]++;
/*中间*/
int mid=f[bl[x]+1][bl[y]-1],mnum=fnum[bl[x]+1][bl[y]-1];
//处理
//两边的统计
int ans=0,ansnum=0;
for(int i=1;i<=id;i++)
if(cnt[a[i]]>ansnum || cnt[a[i]]==ansnum&&v[a[i]]<v[ans])
ansnum=cnt[a[i]],ans=a[i];
//与中间比较
if(mnum>ansnum || mnum==ansnum&&v[ans]<v[mid]) ans=mid;
return v[ans];
}
int main(){
init();
init2();
int x=0;
while(m--){
int l,r;read(l);read(r);
l=(l+x-1)%n+1;r=(r+x-1)%n+1;
if(l>r) swap(l,r);
x=query(l,r);
printf("%d\n",x);
}
return 0;
}