RT,洛谷上题目在这里:颜色
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e4+5,MAXM=2e4+5;
int n,m,q,col[MAXN];
int block,sum,pos[MAXN];
int t[35][MAXM],val[35][35][MAXM],tn[MAXN],ans,lst_ans=0;
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m>>q;
block=1700;
sum=(n%block==0?n/block:(n/block)+1);
for(int i=1;i<=n;i++){
cin>>col[i];
pos[i]=(i%block==0?i/block:(i/block)+1);
}
for(int i=1;i<=sum;i++){
for(int j=(i-1)*block+1;j<=min(i*block,n);j++){
t[i][col[j]]++;
}
for(int j=1;j<=m;j++){
t[i][j]+=t[i-1][j];
}
}
for(int i=1;i<=sum;i++){
for(int j=i;j<=sum;j++){
for(int k=1;k<=m;k++){
val[i][j][k]=val[i][j][k-1];
val[i][j][k]+=(t[j][k]-t[i-1][k])*(t[j][k]-t[i-1][k]);
}
}
}
for(int i=1,l,r,a,b;i<=q;i++){
memset(tn,0,sizeof tn);
cin>>l>>r>>a>>b;
l^=lst_ans,r^=lst_ans;
a^=lst_ans,b^=lst_ans;
// cout<<l<<" "<<r<<" "<<a<<" "<<b<<"\n";
ans=0;
if(pos[r]-pos[l]<=1){
for(int j=l;j<=r;j++){
if(col[j]<a||col[j]>b) continue;
ans+=(2*tn[col[j]])+1;
tn[col[j]]++;
}
cout<<ans<<"\n";
}
else{
for(int j=a;j<=b;j++)
ans+=val[pos[l]+1][pos[r]-1][j];
for(int j=l;j<=pos[l]*block;j++){
if(col[j]<a||col[j]>b) continue;
ans+=2*(t[pos[r]-1][col[j]]-t[pos[l]][col[j]]+tn[col[j]])+1;
tn[col[j]]++;
}
for(int j=(pos[r]-1)*block;j<=r;j++){
if(col[j]<a||col[j]>b) continue;
ans+=2*(t[pos[r]-1][col[j]]-t[pos[l]][col[j]]+tn[col[j]])+1;
tn[col[j]]++;
}
cout<<ans<<"\n";
}
lst_ans=ans;
}
return 0;
}