LITES - Bật đèn
Tác giả: ladpro98
Ngôn ngữ: Pascal
program lites;
uses math;
const maxn=100005;
fi='';
var it,lazy:array[1..4*maxn] of longint;
n,m,i,p,x,y:longint;
inp:text;
procedure update(k,l,r,i,j:longint);
var m:longint;
begin
if lazy[k]=1 then
begin
it[k]:=(r-l+1)-it[k];
if l<>r then
begin
lazy[2*k]:=lazy[2*k] xor 1;
lazy[2*k+1]:=lazy[2*k+1] xor 1;
end;
lazy[k]:=0;
end;
if (l>r) or (r<i) or (j<l) then exit;
if (i<=l) and (r<=j) then
begin
it[k]:=(r-l+1)-it[k];
if l<>r then
begin
lazy[2*k]:=lazy[2*k] xor 1;
lazy[2*k+1]:=lazy[2*k+1] xor 1;
end;
exit;
end;
m:=(l+r) shr 1;
update(2*k,l,m,i,j);
update(2*k+1,m+1,r,i,j);
it[k]:=it[2*k]+it[2*k+1];
end;
function get(k,l,r,i,j:longint):longint;
var p,q,m:longint;
begin
if (l>r) or (r<i) or (j<l) then exit(0);
if lazy[k]=1 then
begin
it[k]:=(r-l+1)-it[k];
if l<>r then
begin
lazy[2*k]:=lazy[2*k] xor 1;
lazy[2*k+1]:=lazy[2*k+1] xor 1;
end;
lazy[k]:=0;
end;
if (i<=l) and (r<=j) then exit(it[k]);
m:=(l+r) shr 1;
p:=get(2*k,l,m,i,j);
q:=get(2*k+1,m+1,r,i,j);
exit(p+q);
end;
begin
assign(inp,fi);reset(inp);
readln(inp,n,m);
for i:=1 to m do
begin
readln(inp,p,x,y);
if p=0 then update(1,1,n,x,y)
else
writeln(get(1,1,n,x,y));
end;
end.