rt,写了两版,有一版过了就行
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=405;
int belong[N],bl[M],br[M],a[N],kc;
int ans[M][M],cnt[M][N],ton[N];
signed main(){
int n,m,c;
cin>>n>>c>>m;
kc=sqrt(n);
int tot=ceil(n*1.0/kc);
for(int i=1;i<=tot;i++){
bl[i]=(i-1)*kc+1;
br[i]=i*kc;
}
br[tot]=n;
for(int i=1;i<=n;i++){
cin>>a[i];
belong[i]=(i-1)/kc+1;
cnt[belong[i]][a[i]]++;
}
for(int i=1;i<=tot;i++){
for(int j=0;j<=c;j++){
cnt[i][j]+=cnt[i-1][j];
// cout<<cnt[i][j]<<' ';
}
// cout<<'\n';
}
for(int i=1;i<=tot;i++){
for(int j=i;j<=tot;j++){
ans[i][j]=ans[i][j-1];
for(int k=bl[j];k<=br[j];k++){
ton[a[k]]++;
if(ton[a[k]]%2==0){
ans[i][j]++;
}else if(ton[a[k]]>=3){
ans[i][j]--;
}
}
// cout<<ans[i][j]<<' ';
}
// cout<<'\n';
memset(ton,0,sizeof(ton));
}
int lst=0;
while(m--){
int l,r;
cin>>l>>r;
l=(l+lst)%n+1,r=(r+lst)%n+1;
if(l>r){
swap(l,r);
}
int L=belong[l],R=belong[r];
int res;
if(R-L<=1){
res=0;
for(int i=l;i<=r;i++){
ton[a[i]]++;
if(ton[a[i]]%2==0){
res++;
}else if(ton[a[i]]>3){
res--;
}
}
for(int i=l;i<=r;i++){
ton[a[i]]--;
}
}else{
res=ans[L+1][R-1];
for(int i=l;i<=br[L];i++){
ton[a[i]]++;
if((ton[a[i]]+cnt[R-1][a[i]]-cnt[L][a[i]])%2==0){
res++;
}else if(ton[a[i]]+cnt[R-1][a[i]]-cnt[L][a[i]]>=3){
res--;
}
}
for(int i=bl[R];i<=r;i++){
ton[a[i]]++;
if((ton[a[i]]+cnt[R-1][a[i]]-cnt[L][a[i]])%2==0){
res++;
}else if(ton[a[i]]+cnt[R-1][a[i]]-cnt[L][a[i]]>=3){
res--;
}
}
for(int i=l;i<=br[L];i++){
ton[a[i]]--;
}
for(int i=bl[R];i<=r;i++){
ton[a[i]]--;
}
}
cout<<res<<'\n';
lst=res;
}
}
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=405;
int belong[N],bl[M],br[M],a[N],kc;
int ans[M][M],cnt[M][N],ton[N];
int main(){
int n,m,c;
cin>>n>>c>>m;
kc=sqrt(n);
int tot=0;
for(int i=1;i<=n;i++){
if(i%kc==1){
br[tot]=i-1;
tot++;
bl[tot]=i;
}
belong[i]=tot;
}
br[tot]=n;
int mx=0;
for(int i=1;i<=n;i++){
cin>>a[i];
mx=max(mx,a[i]);
cnt[belong[i]][a[i]]++;
}
for(int i=1;i<=tot;i++){
for(int j=0;j<=mx;j++){
cnt[i][j]+=cnt[i-1][j];
// cout<<cnt[i][j]<<' ';
}
// cout<<'\n';
}
for(int i=1;i<=tot;i++){
for(int j=i;j<=tot;j++){
ans[i][j]=ans[i][j-1];
for(int k=bl[j];k<=br[j];k++){
ton[a[k]]++;
if(ton[a[k]]%2==0){
ans[i][j]++;
}else if(ton[a[k]]>=3){
ans[i][j]--;
}
}
// cout<<ans[i][j]<<' ';
}
// cout<<'\n';
memset(ton,0,sizeof(ton));
}
int lst=0;
while(m--){
int l,r;
cin>>l>>r;
l=(l+lst)%n+1,r=(r+lst)%n+1;
if(l>r){
swap(l,r);
}
int L=belong[l],R=belong[r];
vector<int> vec;
for(int i=l;i<=br[L];i++){
if(!ton[a[i]]){
vec.push_back(a[i]);
}
ton[a[i]]++;
}
if(L!=R){
for(int i=bl[R];i<=r;i++){
if(!ton[a[i]]){
vec.push_back(a[i]);
}
ton[a[i]]++;
}
}
int res=0;
if(R-L<=1){
for(int i=0;i<vec.size();i++){
int v=vec[i];
if(ton[v]%2==0){
res++;
}
}
}else{
res=ans[L+1][R-1];
for(int i=0;i<vec.size();i++){
int v=vec[i];
// cout<<v<<" "<<ton[v]<<'\n';
if(cnt[R-1][v]-cnt[L][v]==0){
if(ton[v]%2==0){
res++;
}
}else{
if((cnt[R-1][v]-cnt[L][v])%2!=0&&ton[v]%2!=0){
res++;
}
if((cnt[R-1][v]-cnt[L][v])%2==0&&ton[v]%2!=0){
res--;
}
}
}
}
cout<<res<<'\n';
lst=res;
for(int i=0;i<vec.size();i++){
ton[vec[i]]=0;
}
vec.clear();
}
}