<script>
let MAX = 100000;
let tree=
new
Array(MAX);
let lazy =
new
Array(MAX);
for
(let i=0;i<MAX;i++)
{
tree[i]=0;
lazy[i]=
false
;
}
function
toggle(node,st,en,us,ue)
{
if
(lazy[node])
{
lazy[node] =
false
;
tree[node] = en - st + 1 - tree[node];
if
(st < en)
{
lazy[node << 1] = !lazy[node << 1];
lazy[1 + (node << 1)] = !lazy[1 + (node << 1)];
}
}
if
(st > en || us > en || ue < st)
{
return
;
}
if
(us <= st && en <= ue)
{
tree[node] = en - st + 1 - tree[node];
if
(st < en)
{
lazy[node << 1] = !lazy[node << 1];
lazy[1 + (node << 1)] = !lazy[1 + (node << 1)];
}
return
;
}
let mid = Math.floor((st + en) / 2);
toggle((node << 1), st, mid, us, ue);
toggle((node << 1) + 1, mid + 1, en, us, ue);
if
(st < en)
{
tree[node] = tree[node << 1] +
tree[(node << 1) + 1];
}
}
function
countQuery(node,st,en,qs,qe)
{
if
(st > en || qs > en || qe < st)
{
return
0;
}
if
(lazy[node])
{
lazy[node] =
false
;
tree[node] = en - st + 1 - tree[node];
if
(st < en)
{
lazy[node << 1] = !lazy[node << 1];
lazy[(node << 1) + 1] = !lazy[(node << 1) + 1];
}
}
if
(qs <= st && en <= qe)
{
return
tree[node];
}
let mid = Math.floor((st + en) / 2);
return
countQuery((node << 1), st, mid, qs, qe) +
countQuery((node << 1) + 1, mid + 1, en, qs, qe);
}
let n = 5;
toggle(1, 0, n - 1, 1, 2);
toggle(1, 0, n - 1, 2, 4);
document.write(countQuery(1, 0, n - 1, 2, 3)+
"<br>"
);
toggle(1, 0, n - 1, 2, 4);
document.write(countQuery(1, 0, n - 1, 1, 4)+
"<br>"
);
</script>