#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
const int M = sqrt(N);
int n,q;
int a[N];
int Id[N],siz;
pair<int,int> group[M];
int p = 0;
int sum[M][N];
int maxn[M][M];
int cnt[N];
bool vis[N];
int query(int l,int r)
{
if(Id[l]+1 >= Id[r])
{
for(int i = l; i <= r; i++)
cnt[a[i]]++;
int ans = 0;
for(int i = l; i <= r; i++)
if(cnt[a[i]] % 2 == 0 && !vis[a[i]])
ans++,vis[a[i]] = 1;
for(int i = l; i <= r; i++)
cnt[a[i]] = 0,vis[a[i]] = 0;
return ans;
}
else
{
int ans = maxn[Id[l]+1][Id[r]-1];
for(int i = l; i <= group[Id[l]].second; i++)
cnt[a[i]]++;
for(int i = group[Id[r]].first; i <= r; i++)
cnt[a[i]]++;
for(int i = l; i <= group[Id[l]].second; i++)
if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 0 && (cnt[a[i]] % 2 == 1 || (sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) == 0) && !vis[a[i]])
ans++,vis[a[i]] = 1;
else if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 1 && (cnt[a[i]] % 2 == 1) && ((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) != 0) && !vis[a[i]])
ans--,vis[a[i]] = 1;
for(int i = group[Id[r]].first; i <= r; i++)
if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 0 && (cnt[a[i]] % 2 == 1 || (sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) == 0) && !vis[a[i]])
ans++,vis[a[i]] = 1;
else if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 1 && (cnt[a[i]] % 2 == 1) && ((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) != 0) && !vis[a[i]])
ans--,vis[a[i]] = 1;
for(int i = l; i <= group[Id[l]].second; i++)
cnt[a[i]] = 0,vis[a[i]] = 0;
for(int i = group[Id[r]].first; i <= r; i++)
cnt[a[i]] = 0,vis[a[i]] = 0;
return ans;
}
}
int main()
{
int c;
cin >> n >> c >> q;
for(int i = 1; i <= n; i++)
cin >> a[i];
siz = sqrt(n);
for(int i = 1; i <= n; i++)
Id[i] = (i-1)/siz+1;
for(int i = 1; i <= n; i++)
if(Id[i] != Id[i-1])
group[++p].first = i,
group[p-1].second = i-1;
group[p].second = n;
for(int i = 1; i <= n; i++)
sum[Id[i]][a[i]]++;
for(int i = 1; i <= p; i++)
for(int j = 1; j <= c; j++)
sum[i][j] = sum[i-1][j]+sum[i][j];
for(int i = 1; i <= p; i++)
{
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
for(int j = i; j <= p; j++)
{
maxn[i][j] = maxn[i][j-1];
for(int k = group[j].first; k <= group[j].second; k++)
cnt[a[k]]++;
for(int k = group[j].first; k <= group[j].second; k++)
if(cnt[a[k]] % 2 == 0 && !vis[a[k]])
maxn[i][j]++,vis[a[k]] = 1;
else if(cnt[a[k]] % 2 == 1 && vis[a[k]])
maxn[i][j]--,vis[a[k]] = 0;
}
}
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
int x = 0,l,r;
while(q--)
{
cin >> l >> r;
l = (l+x) % n + 1;
r = (r+x) % n + 1;
if(l > r) swap(l,r);
x = query(l,r);
cout << x << endl;
}
return 0;
}
为什么空间开 1e5 炸20pts,开 2e5 过了