【Codeforces Round 340 (Div 2)E】【莫队算法 真实区间思想】XOR and Favorite Number m组区间询问 问区间中多少连续段异或值为k

E. XOR and Favorite Number
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l ≤ i ≤ j ≤ r and the xor of the numbers ai, ai + 1, ..., aj is equal to k.

Input

The first line of the input contains integers n, m and k (1 ≤ n, m ≤ 100 000, 0 ≤ k ≤ 1 000 000) — the length of the array, the number of queries and Bob's favorite number respectively.

The second line contains n integers ai (0 ≤ ai ≤ 1 000 000) — Bob's array.

Then m lines follow. The i-th line contains integers li and ri (1 ≤ li ≤ ri ≤ n) — the parameters of the i-th query.

Output

Print m lines, answer the queries in the order they appear in the input.

Examples
input
6 2 3
1 2 1 1 0 3
1 6
3 5

output
7
0

input
5 3 1
1 1 1 1 1
1 5
2 4
1 3

output
9
4
4

Note

In the first sample the suitable pairs of i and j for the first query are: (1, 2), (1, 4), (1, 5), (2, 3), (3, 6), (5, 6), (6, 6). Not a single of these pairs is suitable for the second query.

In the second sample xor equals 1 for all subarrays of an odd length.

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 1e5+10, M = 1e5+10, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int n, m, k;
struct A
{
int id;
int o;
int l, r;
bool operator < (const A&b)const
{
if (id != b.id)return id < b.id;
return r < b.r;
}
}a[M];
LL ans[M];
int num[(int)1.05e6];
int c[N];
int ins(int p)
{
int tmp = num[c[p] ^ k];
++num[c[p]];
return tmp;
}
int del(int p)
{
--num[c[p]];
int tmp = num[c[p] ^ k];
return tmp;
}
int main()
{
while (~scanf("%d%d%d", &n,&m,&k))
{
int len = sqrt(n);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &c[i]);
c[i] ^= c[i - 1];
}
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &a[i].l, &a[i].r); --a[i].l;
a[i].id = a[i].l / len;
a[i].o = i;
}
sort(a + 1, a + m + 1);
MS(num, 0);
LL ANS = 0;
int l = a[1].l;
int r = a[1].l-1;

for (int i = 1; i <= m; ++i)
{
while (l > a[i].l)ANS += ins(--l);
while (r < a[i].r)ANS += ins(++r);
while (l < a[i].l)ANS -= del(l++);
while (r > a[i].r)ANS -= del(r--);
ans[a[i].o] = ANS;
}
for (int i = 1; i <= m; ++i)printf("%lld\n", ans[i]);
}
return 0;
}
/*
【trick&&吐槽】

1，检查是否爆int————不要只检验答案输出是lld还是d，所有定义也都要检查下
2，检查数组是否开小。这道题虽然数字的范围都是1e6，然而，异或之后还是可达2^20-1的。
于是，数组还是要开到1<<20的
3，这题的异或是对区间

【题意】

【类型】

【分析】
1，这题询问众多，而且询问都是[l,r]的形式。

2，涉及到区间连续异或和，我们想到用前缀和映射思想。
3，数字范围最大只有1e6，于是可以开差不多（其实要1<<20大小），做映射。

【时间复杂度&&优化】
O(msqrt(n))

【数据】
5 4 0
0 0 0 0 0
1 5
3 3
5 5
2 4

*/

• 本文已收录于以下专栏：

Codeforces617 E . XOR and Favorite Number(莫队算法)

XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes ...
• huayunhualuo
• 2016年01月26日 10:38
• 1882

XOR and Favorite Number

Description Bob has a favorite number k and ai of length n. Now he asks you to answer m queri...
• ACMer_AK
• 2016年01月27日 20:28
• 499

Hrbust 1688 数论中的异或【思维+数论异或】好题~

• mengxiang000000
• 2016年12月20日 20:54
• 561

Codeforces 617E XOR and Favorite Number (区间异或和 莫队算法 分块暴力)

Codeforces 617E XOR and Favorite Number (区间异或和 莫队算法 分块暴力)
• Tc_To_Top
• 2016年02月25日 11:32
• 2150

noj 2107 有趣的区间异或值（异或，找规律）

• acm_cxq
• 2016年08月20日 15:49
• 2401

POJ 题目3225 区间（线段树区间交并差，区间异或）

• yu_ch_sh
• 2015年09月01日 01:03
• 1093

bzoj 5057: 区间k小值5

• qq_36797743
• 2017年10月13日 08:02
• 172

Codeforces 340E Iahub and Permutations【思维+错排Dp】

E. Iahub and Permutations time limit per test 1 second memory limit per test 256 megabytes ...
• mengxiang000000
• 2017年07月06日 14:01
• 230

【Codeforces Round 340 (Div 2)D】【讨论题】Polyline 三点用最少数量连续不分叉线段连接

D. Polyline time limit per test 1 second memory limit per test 256 megabytes input ...
• snowy_smile
• 2016年02月28日 13:04
• 459

cf617 E. XOR and Favorite Number【莫队算法】

UESTCACM-莫队算法讲解视频#include using namespace std; typedef long long ll; const int M=1e6; const int N=1...
• xinag578
• 2016年04月18日 10:55
• 363

举报原因： 您举报文章：【Codeforces Round 340 (Div 2)E】【莫队算法 真实区间思想】XOR and Favorite Number m组区间询问 问区间中多少连续段异或值为k 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)