#include<algorithm>
#include<cstdio>
#include<cmath>
int type[40004],mark[40004],bars[202][40004],plan[202][202],hash[40004],block;
inline int nowblock(int now){
return (now-1)/block+1;
};
inline int min(int first,int second){
if(first<second){
return first;
};
return second;
};
int main(int argc,char **argv){
int size,action;
scanf("%d %d",&size,&action);
block=sqrt(size);
for(int iter=1;iter<=size;++iter){
scanf("%d",&type[iter]);
mark[iter]=type[iter];
};
std::sort(mark+1,mark+1+size);
int newsize=std::unique(mark+1,mark+1+size)-mark-1,count=nowblock(size);
for(int iter=1;iter<=size;++iter){
type[iter]=std::lower_bound(mark+1,mark+1+newsize,type[iter])-mark;
};
for(int first=1;first<=count;++first){
for(int second=block*(first-1)+1;second<=min(block*first,size);++second){
++bars[first][type[second]];
};
for(int second=1;second<=newsize;++second){
bars[first][second]+=bars[first-1][second];
};
};
for(int first=1;first<=count;++first){
for(int second=first;second<=count;++second){
int maxinum=plan[first][second-1];
for(int third=block*(second-1);third<=min(block*second,size);++third){
if((bars[second][type[third]]-bars[first-1][type[third]]>bars[second][maxinum]-bars[first-1][maxinum])||(bars[second][type[third]]==bars[second][maxinum]-bars[first-1][maxinum]&&type[third]<maxinum)){
maxinum=type[third];
};
};
plan[first][second]=maxinum;
};
};
int last=0;
do{
int first,second;
scanf("%d %d",&first,&second);
first=(first+last-1)%size+1;
second=(second+last-1)%size+1;
if(first>second){
std::swap(first,second);
};
int blockfirst=nowblock(first),blocksecond=nowblock(second),maxinum=0;
if(blocksecond-blockfirst<=1){
for(int iter=first;iter<=second;++iter){
++hash[type[iter]];
};
for(int iter=first;iter<=second;++iter){
if(hash[type[iter]]>hash[maxinum]||(hash[type[iter]]==hash[maxinum]&&type[iter]<maxinum)){
maxinum=type[iter];
};
};
for(int iter=first;iter<=second;++iter){
hash[type[iter]]=0;;
};
}else{
for(int iter=first;iter<=block*blockfirst;++iter){
++hash[type[iter]];
};
for(int iter=block*(blocksecond-1)+1;iter<=second;++iter){
++hash[type[iter]];
};
maxinum=plan[blockfirst+1][blocksecond-1];
for(int iter=first;iter<=block*blockfirst;++iter){
int prev=hash[maxinum]+bars[blocksecond-1][maxinum]-bars[blockfirst][maxinum];
int next=hash[type[iter]]+bars[blocksecond-1][type[iter]]-bars[blockfirst][type[iter]];
if(next>prev||(next==prev&&maxinum>type[iter])){
maxinum=type[iter];
};
};
for(int iter=block*(blocksecond-1)+1;iter<=second;++iter){
int prev=hash[maxinum]+bars[blocksecond-1][maxinum]-bars[blockfirst][maxinum];
int next=hash[type[iter]]+bars[blocksecond-1][type[iter]]-bars[blocksecond-1][type[iter]];
if(next>prev||(next==prev&&maxinum>type[iter])){
maxinum=type[iter];
};
};
for(int iter=first;iter<=block*blockfirst;++iter){
hash[type[iter]]=0;
};
for(int iter=block*(blocksecond-1)+1;iter<=second;++iter){
hash[type[iter]]=0;
};
};
printf("%d\n",last=mark[maxinum]);
}while(--action);
return 0;
};
样例过 5pts 求调。