class Block{
public:
typedef long long int ll;
Block(int _n){
n = _n;
value.assign(n + 1, 0);
sum.assign(n + 1, 0);
add.assign(n + 1, 0);
blen = pow(n, 0.33);
idx.assign(n + 1, 0);
for (int i = 1; i <= n; i++){
idx[i] = (i - 1) / blen + 1;
}
}
ll fun(ll a, ll b){
return a ^ b;
}
void modfiy(int l, int r, ll v){
int len = min(idx[l] * blen, r);
for (int i = l; i <= len; i++){
sum[idx[i]] -= fun(value[i], add[idx[i]]);
value[i] = fun(value[i],v);
sum[idx[i]] += fun(value[i], add[idx[i]]);
}
if (idx[l] != idx[r]){
for (int i = (idx[r] - 1) * blen + 1; i <= r; i++){
sum[idx[i]] -= fun(value[i], add[idx[i]]);
value[i] = fun(value[i], v);
sum[idx[i]] += fun(value[i], add[idx[i]]);
}
}
for (int i = idx[l] + 1; i < idx[r]; i++){
add[i] = fun(add[i],1);
sum[i] = blen - sum[i];
}
}
ll query(int l, int r){
ll len = min(idx[l] * blen, r), ans = 0;
for (int i = l; i <= len; i++){
ans += fun(value[i], add[idx[i]]);
}
if (idx[l] != idx[r]){
for (int i = (idx[r] - 1) * blen + 1; i <= r; i++){
ans += fun(value[i], add[idx[i]]);
}
}
for (int i = idx[l] + 1; i < idx[r]; i++){
ans += sum[i];
}
return ans;
}
private:
vector<int> idx;
vector<ll> sum,value,add;
int n,blen;
};