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.

Download