张凯_巨大 @ 2022-01-12 19:43:26
rt,调了一天了,还是只有十分。 (除17,18外全部WA)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int vl[500010],v2[500010];
int v3[500010];
int ds;
int n,m,bl;
int ord[500010];
int vs[210][500010],mx[210],mv[210];
bool cmp(int x,int y)
{
return vl[x]<vl[y];
}
int q[500010],t[500010];
int getmx(int il,int ir,int qs)
{
int ret=0,r2;
for(int i=il;i<=ir;i++)
{
if(q[v2[i]]!=qs)
{
q[v2[i]]=qs;
t[v2[i]]=0;
}
t[v2[i]]++;
if(t[v2[i]]>ret||t[v2[i]]==ret&&v2[i]<r2)
{
ret=t[v2[i]];
r2=v2[i];
}
}
return r2;
}
int main()
{
cin>>n>>m;
bl=sqrt(n);
for(int i=1;i<=n;i++)
{
cin>>vl[i];
ord[i]=i;
}
sort(ord+1,ord+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(vl[ord[i]]!=vl[ord[i-1]])
{
ds++;
v3[ds]=vl[ord[i]];
}
v2[ord[i]]=ds;
}
for(int i=1;i<n/bl;i++)
{
for(int j=1;j<=ds;j++)
{
vs[i][j]+=vs[i-1][j];
}
for(int j=i*bl;j<i*bl+bl;j++)
{
vs[i][v2[j]]++;
if(mx[i]<vs[i][v2[j]]-vs[i-1][v2[j]]||mx[i]==vs[i][v2[j]]-vs[i-1][v2[j]]&&mv[i]>v2[j])
{
mv[i]=v2[j];
mx[i]=vs[i][v2[j]]-vs[i-1][v2[j]];
}
}
//cout<<mv[i]<<endl;
}
int x=0,k,xr,y;
while(m--)
{
int il,ir;
cin>>il>>ir;
il=(il+x-1)%n+1;
ir=(ir+x-1)%n+1;
if(il>ir)
{
swap(il,ir);
}
//cout<<il<<' '<<ir<<endl;
k=0;
if(il/bl==ir/bl)
{
x=getmx(il,ir,m);
}
else
{
getmx(il,il/bl*bl+bl-1,m);
getmx(ir/bl*bl,ir,m);
k=0;
for(int i=il;i<il/bl*bl+bl;i++)
{
int tmp=t[v2[i]]+vs[ir/bl-1][v2[i]]-vs[il/bl][v2[i]];
if(tmp>k||tmp==k&&v2[i]<x)
{
x=v2[i];
k=tmp;
}
}
for(int i=ir/bl*bl;i<=ir;i++)
{
int tmp=t[v2[i]]+vs[ir/bl-1][v2[i]]-vs[il/bl][v2[i]];
if(tmp>k||tmp==k&&v2[i]<x)
{
x=v2[i];
k=tmp;
}
}
for(int i=il/bl+1;i<ir/bl;i++)
{
xr=mv[i];
y=vs[ir/bl-1][xr]-vs[il/bl][xr];
//cout<<y<<' '<<xr<<endl;
if(k<y||y==k&&xr<x)
{
x=xr;
k=y;
}
}
}
x=v3[x];
cout<<x<<endl;
}
return 0;
}