卿学姐在bilibili上讲的例题
https://www.bilibili.com/video/av4291097/?from=search&seid=3446180275379041786
因为维护的区间是L-1,R,所以下边都是L-1
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1<<20;
LL pos[MAXN];
LL Cnt[MAXN],ans[MAXN];
int num[MAXN];
struct node
{
int l,r,id;
} Q[MAXN];
bool cmp(node a,node b)
{
if (pos[a.l]==pos[b.l])
return a.r < b.r;
return pos[a.l] < pos[b.l];
}
int n,m,k;
int L=1,R=0;
LL Ans=0;
void add(int x)
{
Ans+=Cnt[num[x]^k];
Cnt[num[x]]++;
}
void del(int x)
{
Cnt[num[x]]--;
Ans-=Cnt[num[x]^k];
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m >> k;
int sz=sqrt(n);
for (int i=1; i<=n; i++)
{
cin >> num[i];
num[i]^=num[i-1];
pos[i]=i/sz;
}
for (int i=1; i<=m; i++)
{
cin >> Q[i].l >> Q[i].r;
Q[i].id=i;
}
Cnt[0]=1;
sort(Q+1,Q+m+1,cmp);
for (int i=1; i<=m; i++)
{
while(L < Q[i].l)
{
del(L-1);
L++;
}
while(L > Q[i].l)
{
L--;
add(L-1);
}
while(R < Q[i].r)
{
R++;
add(R);
}
while(R > Q[i].r)
{
del(R);
R--;
}
ans[Q[i].id]=Ans;
}
for (int i=1; i<=m; i++)
cout << ans[i] << endl;
return 0;
}