如题
调崩了,分块和我有仇罢/kk
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#define MAXN 125000
#define QWQ cout << "qwq" << endl;
using namespace std;
int n, m, CCC, cnt;
int a[MAXN + 10];
int pl[MAXN + 10], pr[MAXN + 10], cl[MAXN + 10], len;
int c[1000 + 10][MAXN + 10], T[MAXN + 10];
int f[1000 + 10][1000 + 10];
int ans;
void qwq(int l, int r, int num) {
T[num]++;
if((c[r][num] - c[l - 1][num] + T[num]) % 2 == 0) ans++;
else if((c[r][num] - c[l - 1][num] + T[num]) > 2) ans--;
}
int solve(int l, int r) {
int L = cl[l], R = cl[r];
int x = 0, y = 0;
if(L + 1 <= R - 1) x = L + 1, y = R - 1;
ans = f[x][y];
if(x == y) {
for(int p = l; p <= r; p++) qwq(x, y, a[p]);
for(int p = l; p <= r; p++) T[a[p]]--;
}
else {
for(int p = l; p <= pr[L]; p++) qwq(x, y, a[p]);
for(int p = pl[R]; p <= r; p++) qwq(x, y, a[p]);
for(int p = l; p <= pr[L]; p++) T[a[p]]--;
for(int p = pl[R]; p <= r; p++) T[a[p]]--;
}
return ans;
}
void block() {
len = sqrt(n);
for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
pl[p] = (p - 1) * len + 1;
pr[p] = p * len;
}
for(int p = 1; p <= n; p++)
cl[p] = (p - 1) / len + 1, c[cl[p]][a[p]]++;
for(int p = 1; p <= MAXN; p++)
for(int i = 1; i <= ceil(n * 1.0 / len); i++)
c[i][p] += c[i - 1][p];
for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
int tat = 0;
for(int i = pl[p]; i <= n; i++) {
T[a[i]]++;
if(T[a[i]] % 2 == 0) tat++;
else if(T[a[i]] > 2) tat--;
f[p][cl[i]] = tat;
}
for(int i = pl[p]; i <= n; i++)
T[a[i]]--;
}
/*for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
for(int i = p; i <= ceil(n * 1.0 / len); i++)
cout << f[p][i] << ' ';
cout <<endl;
}*/
memset(T, 0, sizeof(T));
}
int main() {
//freopen("test.txt", "r", stdin);
//freopen("taxt.txt", "w", stdout);
cin >> n >> CCC >> m;
for(int p = 1; p <= n; p++) cin >> a[p];
block();
int last = 0;
while(m--) {
int x, y;
cin >> x >> y;
x = (x + last) % n + 1, y = (y + last) % n + 1;
if(x > y) swap(x, y);
last = solve(x, y);
cout << last << endl;
}
}