OranJun @ 2020-02-02 08:42:25
/*Code by Codercjh*/
#include<bits/stdc++.h>
#define fr(i,a,b) for(int i=(a);i<=(b);++i)
#define rf(i,a,b) for(int i=(a);i>=(b);--i)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T &x){
char c=getchar();T fh=0;bool f=false;
while(!isdigit(c))f|=(c=='-'),c=getchar();
while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar();
x=f?-fh:fh;
return;
}
const int N=4e4+5;
const int M=5e4+5;
struct node{int rk,s;}a[N];
int l[205],r[205],b[N];
int n,m,sz,pos[N],rank[N],cnt[N],p[205][205],s[205][N];
int main(){
freopen("fenkuai.in","r",stdin);
read(n),read(m);
sz=sqrt(n);
fr(i,1,n)read(a[i].s),b[i]=a[i].s;
fr(i,1,n/sz+1){
l[i]=r[i-1]+1,r[i]=min(i*sz,n);
fr(j,l[i],r[i])
pos[j]=i;
}
sort(b+1,b+n+1);
int tot=unique(b+1,b+n+1)-b-1;
fr(i,1,n)a[i].rk=lower_bound(b+1,b+tot+1,a[i].s)-b,rank[a[i].rk]=a[i].s;
fr(le,1,sz){
fr(ri,le,sz){
int zs=0;
fr(i,l[ri],r[ri]){
++cnt[a[i].rk];
if(cnt[a[i].rk]>cnt[zs])zs=a[i].rk;
else if(cnt[a[i].rk]==cnt[zs]&&zs>a[i].rk)zs=a[i].rk;
}
p[le][ri]=zs;
}
fr(i,1,tot)cnt[i]=0;
}
fr(i,1,sz){
fr(j,1,tot)
s[i][j]=s[i-1][j];
fr(j,l[i],r[i])
++s[i][a[j].rk];
}
int l0,r0,x=0,sum;
while(m--){
read(l0),read(r0);
l0=(l0+rank[x]-1)%n+1,r0=(r0+rank[x]-1)%n+1;
x=sum=0;
if(l0>r0)swap(l0,r0);
if(pos[r0]-pos[l0]<=1){
fr(i,l0,r0)++cnt[a[i].rk];
fr(i,l0,r0)
if(cnt[a[i].rk]>cnt[x])x=a[i].rk;
else if(cnt[a[i].rk]==cnt[x]&&x>a[i].rk)x=a[i].rk;
printf("%d\n",rank[x]);
fr(i,l0,r0)--cnt[a[i].rk];
}
else{
fr(i,l0,r[pos[l0]])++cnt[a[i].rk];
fr(i,l[pos[r0]],r0)++cnt[a[i].rk];
fr(i,l0,r[pos[l0]])
if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]>sum)
sum=cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk],x=a[i].rk;
else if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]==sum&&a[i].rk<x)x=a[i].rk;
fr(i,l[pos[r0]],r0)
if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]>sum)
sum=cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk],x=a[i].rk;
else if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]==sum&&a[i].rk<x)x=a[i].rk;
if(sum<cnt[p[pos[l0]+1][pos[r0]-1]]+s[pos[r0]-1][p[pos[l0]+1][pos[r0]-1]]-s[pos[l0]][p[pos[l0]+1][pos[r0]-1]])x=p[pos[l0]+1][pos[r0]-1];
else if(sum==cnt[p[pos[l0]+1][pos[r0]-1]]+s[pos[r0]-1][p[pos[l0]+1][pos[r0]-1]]-s[pos[l0]][p[pos[l0]+1][pos[r0]-1]]&&p[pos[l0]+1][pos[r0]-1]<x)x=p[pos[l0]+1][pos[r0]-1];
fr(i,l0,r[pos[l0]])--cnt[a[i].rk];
fr(i,l[pos[r0]],r0)--cnt[a[i].rk];
printf("%d\n",rank[x]);
}
}
return 0;
}
by yurzhang @ 2020-02-02 09:38:33
不会分块 /kk
神仙加油