下载了测试点 1,本地测是对的,交上去第一个点就是 WA。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=405;
int block,tot,lt[M],rt[M],belong[N];
int sum[M][N],ans[M][M],mp[N];
int n,m,c,a[N];
void build(){
block=sqrt(n)+1;
tot=n/block;
if(n%block) tot++;
for(int i=1;i<=tot;i++){
lt[i]=(i-1)*block+1;
rt[i]=i*block;
}
rt[tot]=n;
for(int i=1;i<=n;i++){
belong[i]=(i-1)/block+1;
sum[belong[i]][a[i]]++;
}
for(int i=1;i<=100000;i++){
for(int j=1;j<=tot;j++){
sum[j][i]+=sum[j-1][i];
}
}
for(int i=1;i<=tot;i++){
int now=0;
for(int j=lt[i];j<=n;j++){
mp[a[j]]++;
if(mp[a[j]]%2==0) now++;
else if(mp[a[j]]>2) now--;
ans[i][belong[j]]=now;
}
for(int j=lt[i];j<=n;j++)mp[a[j]]--;
}
}
int ask(int x,int y){
int now=0;
int l=belong[x],r=belong[y];
if(l==r){
for(int i=x;i<=y;i++){
mp[a[i]]++;
if(mp[a[i]]%2==0) now++;
else if(mp[a[i]]>2) now--;
}
for(int i=x;i<=y;i++) mp[a[i]]--;
return now;
}
now=ans[l+1][r-1];
for(int i=x;i<=rt[belong[x]];i++){
mp[a[i]]++;
if((mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]])%2==0) now++;
else if(mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]]>2) now--;
}
for(int i=lt[belong[y]];i<=y;i++){
mp[a[i]]++;
if((mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]])%2==0) now++;
else if(mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]]>2) now--;
}
for(int i=x;i<=rt[belong[x]];i++)mp[a[i]]--;
for(int i=lt[belong[y]];i<=y;i++)mp[a[i]]--;
return now;
}
signed main(){
// freopen("P4135_1.in","r",stdin);
// freopen("test.out","w",stdout);
cin>>n>>c>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build();
for(int i=1,l,r,last_ans;i<=m;i++){
cin>>l>>r;
int L=(l+last_ans)%n+1,R=(r+last_ans)%n+1;
if(L>R) swap(L,R);
last_ans=ask(L,R);
cout<<last_ans<<endl;
}
return 0;
}