这怎么给我干成负数了?
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10, B = 410;
int n, c, m;
int a[N], ans;
int bel[N], blk, tot, L[B], R[B], f[B][B], sum[N];
int num[B][N];
void build()
{
blk = sqrt(n);
for (int i = 1; i <= n; i ++) bel[i] = (i - 1) / blk + 1;
tot = bel[n];
for (int i = 1; i <= tot; i ++)
{
L[i] = R[i - 1] + 1;
R[i] = blk * i;
}
R[tot] = n;
for (int i = 1; i <= tot; i ++)
{
for (int j = i; j <= tot; j ++)
{
for (int k = L[j]; k <= R[j]; k ++)
{
sum[a[k]] ++;
if (sum[a[k]] >= 2 && sum[a[k]] % 2 == 0) f[i][j] ++;
if (sum[a[k]] >= 2 && sum[a[k]] % 2 == 1) f[i][j] --;
}
}
for (int j = 1; j <= c; j ++) num[i][j] = num[i - 1][j];
for (int j = L[i]; j <= R[i]; j ++) num[i][a[j]] ++;
for (int j = 1; j <= c; j ++) sum[j] = 0;
}
}
int solve(int l, int r)
{
int x = bel[l], y = bel[r], ans = 0;
if (x == y || x + 1 == y)
{
for (int i = l; i <= r; i ++)
{
sum[a[i]] ++;
if (sum[a[i]] >= 2 && sum[a[i]] % 2 == 0) ans ++;
if (sum[a[i]] >= 2 && sum[a[i]] % 2 == 1) ans --;
}
for (int i = l; i <= r; i ++) sum[a[i]] = 0;
return ans;
}
ans = f[x + 1][y - 1];
for (int i = l; i <= R[x]; i ++) sum[a[i]] ++;
for (int i = L[y]; i <= r; i ++) sum[a[i]] ++;
for (int i = l; i <= R[x]; i ++)
{
if (sum[a[i]] == 0) continue;
int k = num[y - 1][a[i]] - num[x][a[i]];
if (k >= 2 && k % 2 == 0)
{
if (sum[a[i]] % 2 == 1) ans --;
sum[a[i]] = 0;
continue;
}
k += sum[a[i]];
if (k >= 2 && k % 2 == 0) ans ++;
sum[a[i]] = 0;
}
for (int i = L[y]; i <= r; i ++)
{
if (sum[a[i]] == 0) continue;
int k = num[y - 1][a[i]] - num[x][a[i]];
if (k >= 2 && k % 2 == 0)
{
if (sum[a[i]] % 2 == 1) ans --;
sum[a[i]] = 0;
continue;
}
k += sum[a[i]];
if (k >= 2 && k % 2 == 0) ans ++;
sum[a[i]] = 0;
}
return ans;
}
signed main()
{
cin >> n >> c >> m;
for (int i = 1; i <= n; i ++) scanf("%lld", &a[i]);
build();
int l, r;
for (int i = 1; i <= m; i ++)
{
scanf("%lld %lld", &l, &r);
l = (l + ans) % n + 1;
r = (r + ans) % n + 1;
if (l > r) swap(l, r);
ans = solve(l, r);
printf("%lld\n", ans);
}
return 0;
}