rt,输出 2 1 4 2 1,交换奇偶顺序 4 2 1 2 1,过样例但是 0pts。
#include<bits/stdc++.h>
# define int long long
# define rint register int
# define ME ;
# define AK 0
# define IOI return
inline int read();
inline void write(int x);
inline void writesp(int x);
inline void writeln(int x);
using namespace std;
const int N = 1e5 + 10 ,NUM = 2e5 + 10;
int n ,res ,Q ,k ,a[N] ,vis[NUM] ,ans[N] ,block[N];
struct queries{
int l ,r ,id;
inline bool operator <(const queries &b) const{
return (block[l] ^ block[b.l] ? block[l] < block[b.l] : (block[l] & 1 ? r < b.r : r > b.r));
}
}q[N];
inline void add(int x){
//a[x]
res += vis[a[x] ^ k];
vis[a[x]] ++;
} inline void del(int x){
vis[a[x]] --;
res -= vis[a[x] ^ k];
} signed main(){
n = read() ,Q = read() ,k = read();
for(rint i = 1; i <= n;i ++)
a[i] = read() ,a[i] ^= a[i - 1];
int len = N / sqrt(Q);
for(rint i = 1 ;i <= n;i ++) block[i] = (i - 1) / len + 1;
for(rint i = 1 ;i <= Q;i ++){
q[i].l = read() ,q[i].r = read();
q[i].id = i;
} sort(q + 1, q + 1 + Q);
int l = 0 ,r = 0;
vis[0] = 1;
for(rint i = 1 ; i <= Q; i ++){
q[i].l --;
while(l > q[i].l) add(-- l);
while(r < q[i].r) add(++ r);
while(l < q[i].l) del(l ++);
while(r > q[i].r) del(r --);
ans[q[i].id] = res;
} for(rint i = 1; i <= Q;i ++) writeln(ans[q[i].id]);
IOI AK ME
}
inline int read(){
int s = 0 ,w = 0;
char c = getchar();
while(!isdigit(c)){
w |= (c == '-');
c = getchar ();
} while(isdigit(c)){
s = (s << 1) + (s << 3) + (c ^ 48);
c = getchar();
} return w ? -s : s;
} inline void write(int x){
if(x < 0) x = -x ,putchar('-');
if(x > 9) write(x / 10);
putchar(x % 10 | 48);
} inline void writesp(int x){
write(x) ,putchar(' ');
} inline void writeln(int x){
write(x) ,putchar('\n');
}