Code:
#include <bits/stdc++.h>
using namespace std;
long long n,m,q,tot,a[4000005],b[4000005],c[4000005],d[1005][1005],x[4000005],y[4000005],f1[4000005],f2[1005][10005];
long long fun(long long l,long long r)
{
long long cnt1 = f1[l],cnt2 = f1[r],ans = 0;
if(cnt2 - cnt1 <= 1)
{
for(long long i = l;i <= r;i++)
{
c[a[i]]++;
}
for(long long i = l;i <= r;i++)
{
if(c[a[i]] > c[ans] || (a[i] < ans && c[a[i]] == c[ans]))
{
ans = a[i];
}
}
for(long long i = l;i <= r;i++)
{
c[a[i]] = 0;
}
return b[ans];
}
for(long long i = l;i <= y[cnt1];i++)
{
c[a[i]]++;
}
for(long long i = x[cnt2];i <= r;i++)
{
c[a[i]]++;
}
ans = d[cnt1 + 1][cnt2 - 1];
for(long long i = l;i <= y[cnt1];i++)
{
long long u = c[a[i]] + f2[cnt2 - 1][a[i]] - f2[cnt1][a[i]],v = c[ans] + f2[cnt2 - 1][ans] - f2[cnt1][ans];
if(u > v)
{
ans = a[i];
}
else if(u == v && ans > a[i])
{
ans = a[i];
}
}
for(long long i = x[cnt2];i <= r;i++)
{
long long u = c[a[i]] + f2[cnt2 - 1][a[i]] - f2[cnt1][a[i]],v = c[ans] + f2[cnt2 - 1][ans] - f2[cnt1][ans];
if(u > v)
{
ans = a[i];
}
else if(u == v && ans > a[i])
{
ans = a[i];
}
}
for(long long i = l;i <= y[cnt1];i++)
{
c[a[i]] = 0;
}
for(long long i = x[cnt2];i <= r;i++)
{
c[a[i]] = 0;
}
return b[ans];
}
int main()
{
scanf("%lld%lld",&n,&q);
tot = 2 * sqrt(n);
for(long long i = 1;i <= n;i++)
{
scanf("%lld",&a[i]);
b[i] = a[i];
}
sort(b + 1,b + n + 1);
m = unique(b + 1,b + n + 1) - b - 1;//去重
for(long long i = 1;i <= n;i++)
{
a[i] = lower_bound(b + 1,b + m + 1,a[i]) - b;//找第一个
}
for(long long i = 1;i <= tot;i++)
{
x[i] = y[i - 1] + 1;
y[i] = i * tot;
}
if(y[tot] < n)
{
y[tot] = n;
x[tot] = y[tot - 1] + 1;
}
for(long long i = 1;i <= tot;i++)//预处理
{
for(long long j = x[i];j <= y[i];j++)
{
f1[j] = i;
f2[i][a[j]]++;
}
for(long long j = 1;j <= m;j++)
{
f2[i][j] += f2[i - 1][j];
}
}
for(long long i = 1;i <= tot;i++)
{
for(long long j = 1;j <= tot;j++)
{
d[i][j] = d[i][j - 1];
for(long long k = x[j];k <= y[j];k++)
{
if(f2[j][a[k]] - f2[i - 1][a[k]] > f2[j][d[i][j]] - f2[i - 1][d[i][j]] || (a[k] < d[i][j] && f2[j][a[k]] - f2[i - 1][a[k]] == f2[j][d[i][j]] - f2[i - 1][d[i][j]]))
{
d[i][j] = a[k];
}
}
}
}
long long t = 0;
while(q--)
{
long long l0,r0;
scanf("%lld%lld",&l0,&r0);
long long l = (l0 + t - 1) % n + 1,r = (r0 + t - 1) % n + 1;
if(l > r)
{
swap(l,r);
}
t = fun(l,r);//!
printf("%lld\n",t);
}
return 0;
}
!急!
调不出来了,求助一下,AC给 2 关注
\bx\bx\bx