调了一天了,总是超时,题面。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#define ll long long
using namespace std;
ll n, m, k, a[40005], b[40005], d[40005], qp[40005], sum[35][40005], lst, x, y, tk;
ll ask(ll l, ll r)
{
memset(b, 0, sizeof(b));
ll p = qp[l], q = qp[r] - 1, ans = 0, idex = 0;
for (ll i = l; i <= min(k * p, r); i++) b[a[i]]++;
if (p != q + 1)
{
for (ll i = q * k + 1; i <= r; i++) b[a[i]]++;
}
for (ll i = p + 1; i <= q; i++) for (ll j = 1; j <= tk; j++) b[j] += sum[i][j];
for (ll i = 1; i <= tk; i++)
{
//cout << b[i] << " ";
if (b[i] > ans)
{
ans = b[i];
idex = i;
}
}
//cout << endl;
return idex;
}
int main()
{
cin >> n >> m;
k = n / cbrt(n);
for (ll i = 1; i <= n; i++)
{
qp[i] = (i + k - 1) / k;
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1);
tk = unique(b + 1, b + n + 1) - b - 1;
for (ll i = 1; i <= n; i++)
{
ll p = lower_bound(b + 1, b + tk + 1, a[i]) - b;
d[p] = a[i];
a[i] = p;
//cout << a[i] << " ";
sum[qp[i]][a[i]]++;
}
//cout << endl;
while (m--)
{
cin >> x >> y;
x = (lst + x - 1) % n + 1, y = (lst + y - 1) % n + 1;
if (x > y) swap(x, y);
//cout << "_________________________________________________\n";
//cout << x << " " << y << endl;
lst = d[ask(x, y)];
cout << lst << endl;
}
}