#include <bits/stdc++.h>
using
namespace
std;
const
long
long
bsz = 316;
long
long
res = 0;
struct
Query {
long
long
l, r, q_idx, block_idx;
Query() {}
Query(
long
long
_l,
long
long
_r,
long
long
_q_idx)
{
l = _l, r = _r, q_idx = _q_idx, block_idx = _l / bsz;
}
bool
operator<(
const
Query& y)
const
{
if
(block_idx != y.block_idx)
return
block_idx < y.block_idx;
return
r < y.r;
}
};
Query queries[1000005];
unordered_map<
long
long
,
long
long
> cnt;
long
long
n, q, k;
long
long
xorr[1000005];
void
add(
long
long
u)
{
long
long
y = xorr[u] ^ k;
res = res + cnt[y];
cnt[xorr[u]]++;
}
void
del(
long
long
u)
{
cnt[xorr[u]]--;
long
long
y = xorr[u] ^ k;
res = res - cnt[y];
}
void
Mo()
{
sort(queries + 1, queries + q + 1);
vector<
long
long
> ans(q + 1);
long
long
l = 1, r = 0;
res = 0;
cnt[0] = 1;
for
(
long
long
i = 1; i <= q; ++i) {
while
(r < queries[i].r) {
++r;
add(r);
}
while
(l > queries[i].l) {
l--;
add(l - 1);
}
while
(l < queries[i].l) {
del(l - 1);
++l;
}
while
(r > queries[i].r) {
del(r);
--r;
}
ans[queries[i].q_idx] = res;
}
for
(
long
long
i = 1; i <= q; ++i) {
cout << ans[i] << endl;
}
}
int
main()
{
q = 3, k = 3;
vector<
long
long
> v;
v.push_back(0);
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(0);
v.push_back(2);
v.push_back(3);
n = v.size() + 1;
xorr[1] = v[1];
for
(
long
long
i = 2; i <= n; ++i)
xorr[i] = xorr[i - 1] ^ v[i];
queries[1] = Query(1, 6, 1);
queries[2] = Query(2, 4, 2);
queries[3] = Query(2, 6, 3);
Mo();
return
0;
}