2724: [Violet 6]蒲公英
Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2630 Solved: 920
[Submit][Status][Discuss]
Description
Input
修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
Output
Sample Input
6 3
1 2 3 2 1 2
1 5
3 6
1 5
1 2 3 2 1 2
1 5
3 6
1 5
Sample Output
1
2
1
2
1
HINT
修正下:
n <= 40000, m <= 50000
//区间众数 比较经典的做法 据说可以离散莫队做 但是一直没想出怎么转移 参考了黄学长的博客 知道了可以预处理一些东西 强行将复杂度降为n*sqrt(n) 只要
//预处理出i-j块的区间众数和数量 然后暴力查询该区间边缘最多2*sqrt(n)个数 判断是否对块区间众数是否产生影响 进而得出答案....重点别忘记初始化
/**************************************************************
Problem: 2724
User: c20161007
Language: C++
Result: Accepted
Time:3180 ms
Memory:34644 kb
****************************************************************/
#include <bits/stdc++.h>
#define ll long long
#define N 40005
using namespace std;
ll readll(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int readint(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
int p[N],a[N],size,n,m;
vector<int>vec;
int kind[205][205];
int num[205][205];
int sum[205][N];
int jishu[N];
int ans;int ans1;
void advance(int t){
for(int i=1;i<=p[n];i++){
for(int j=1;j<=t;j++) sum[i][j]=sum[i-1][j];
for(int j=(i-1)*size+1;j<=min(n,size*i);j++) sum[i][a[j]]++;
}
// for(int i=1;i<=p[n];i++){
// for(int j=(i-1)*size+1;j<=min(n,size*i);j++){
// cout<<a[j]<<" ";
// }
// cout<<endl;
// for(int j=1;j<=t;j++){
// cout<<i<<" "<<sum[i][j]<<endl;
// }
// }
for(int i=1;i<=p[n];i++){
num[i][i]=-1;
for(int j=(i-1)*size+1;j<=min(n,i*size);j++){
int tp=sum[i][a[j]]-sum[i-1][a[j]];
if(tp>=num[i][i]){
if(tp==num[i][i]) kind[i][i]=min(kind[i][i],a[j]);
else kind[i][i]=a[j];
num[i][i]=tp;
}
}
for(int j=i+1;j<=p[n];j++){
num[i][j]=num[i][j-1];kind[i][j]=kind[i][j-1];
for(int k=(j-1)*size+1;k<=min(n,size*j);k++){
int tp=sum[j][a[k]]-sum[i-1][a[k]];
if(tp>=num[i][j]){
if(tp==num[i][j]) kind[i][j]=min(kind[i][j],a[k]);
else kind[i][j]=a[k];
num[i][j]=tp;
}
}
}
}
}
void update(int l,int r){
for(int i=l;i<=size*p[l];i++){
jishu[a[i]]++;
if(jishu[a[i]]>=ans){
if(jishu[a[i]]==ans) ans1=min(ans1,a[i]);
else ans1=a[i];
ans=jishu[a[i]];
}
}
for(int i=(p[r]-1)*size+1;i<=r;i++){
jishu[a[i]]++;
if(jishu[a[i]]>=ans){
if(jishu[a[i]]==ans) ans1=min(ans1,a[i]);
else ans1=a[i];
ans=jishu[a[i]];
}
}
for(int i=l;i<=size*p[l];i++) jishu[a[i]]=0;
for(int i=(p[r]-1)*size+1;i<=r;i++) jishu[a[i]]=0;
}
int slove(int l,int r){
ans=-1;
if(p[l]==p[r]){
for(int i=l;i<=r;i++){
jishu[a[i]]++;
if(jishu[a[i]]>=ans){
if(jishu[a[i]]==ans) ans1=min(ans1,a[i]);
else ans1=a[i];
ans=jishu[a[i]];
}
}
for(int i=l;i<=r;i++) jishu[a[i]]=0;
return ans1;
}
if(p[r]-p[l]==1){
update(l,r);
return ans1;
}
ans=num[p[l]+1][p[r]-1];ans1=kind[p[l]+1][p[r]-1];
for(int i=l;i<=size*p[l];i++) jishu[a[i]]=sum[p[r]-1][a[i]]-sum[p[l]][a[i]];
for(int i=(p[r]-1)*size+1;i<=r;i++) jishu[a[i]]=sum[p[r]-1][a[i]]-sum[p[l]][a[i]];
update(l,r);
return ans1;
}
int main(){
ios::sync_with_stdio(false);
n=readint();m=readint();size=(int)sqrt(n);
for(int i=1;i<=n;i++){
a[i]=readint();p[i]=(i-1)/size+1;
vec.push_back(a[i]);
}
// cout<<size<<endl;
sort(vec.begin(),vec.end());
int t=unique(vec.begin(),vec.end())-vec.begin();
for(int i=1;i<=n;i++) a[i]=lower_bound(vec.begin(),vec.begin()+t,a[i])-vec.begin()+1;
advance(t);int Lans=0;int l,r;
for(int i=1;i<=m;i++){
l=readint();r=readint();
l=(l+Lans-1)%n+1;r=(r+Lans-1)%n+1;
if(l>r) swap(l,r);
Lans=vec[slove(l,r)-1];
printf("%d\n",Lans);
}
return 0;
}