Cod sursa(job #760438)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 21 iunie 2012 14:03:02
Problema Hotel Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.76 kb
program hotel;
type tip=record
      maxl,maxr,maxt,l:longint;
      end;
 var a:array [1..1 shl 18] of tip;
     i,n,m,op,x,y:longint;
     z:tip;
     b1,b2:array [1..1 shl 17] of char;
     fi,fo:text;
procedure init(nod,l,r:longint);
 var mid:longint;
begin
 if l=r then begin a[nod].maxl:=1; a[nod].maxr:=1; a[nod].maxt:=1; a[nod].l:=1; end
              else begin
                     mid:=(l+r) div 2;
                      init(2*nod,l,mid); init(2*nod+1,mid+1,r);
                     a[nod].maxt:=a[2*nod].maxt+a[2*nod+1].maxt;
                     a[nod].maxl:=a[nod].maxt; a[nod].maxr:=a[nod].maxt; a[nod].l:=a[nod].maxl;
                     end;
 end;
function max(a,b:longint):longint;
begin
 if a>b then max:=a else max:=b;
end;
procedure actualizeaza(nod:longint);
 begin
  a[nod].maxt:=max(max(a[2*nod].maxt,a[2*nod+1].maxt),a[2*nod].maxr+a[2*nod+1].maxl);
  if a[2*nod].maxl=a[2*nod].l then a[nod].maxl:=a[2*nod].maxl+a[2*nod+1].maxl else a[nod].maxl:=a[2*nod].maxl;
   if a[2*nod+1].maxr=a[2*nod+1].l then a[nod].maxr:=a[2*nod+1].maxr+a[2*nod].maxr else a[nod].maxr:=a[2*nod+1].maxr;
 end;
procedure ocupa(nod,l,r:longint);
 var mid:longint;
begin
 if (x<=l) and (y>=r) then begin a[nod].maxt:=0; a[nod].maxl:=0; a[nod].maxr:=0; end
                 else begin
                       mid:=(l+r) div 2;
                        if x<=mid then ocupa(2*nod,l,mid);
                         if y>mid then ocupa(2*nod+1,mid+1,r);
                        actualizeaza(nod);
                       end;
end;
procedure elibereaza(nod,l,r:longint);
 var mid:longint;
begin
 if (x<=l) and (y>=r) then begin a[nod].maxt:=a[nod].l; a[nod].maxl:=a[nod].l; a[nod].maxr:=a[nod].l; end
                  else begin
                       mid:=(l+r) div 2;
                       if a[nod].maxt=0 then begin a[2*nod].maxt:=0; a[2*nod].maxl:=0; a[2*nod].maxr:=0; a[2*nod+1].maxt:=0; a[2*nod+1].maxl:=0; a[2*nod+1].maxr:=0; end;
                          if x<=mid then elibereaza(2*nod,l,mid);
                           if y>mid then elibereaza(2*nod+1,mid+1,r);
                     {  if a[nod].maxt=0 then begin a[2*nod]:=z; a[2*nod+1]:=z; end;}
                          actualizeaza(nod);
                       end;
end;
begin
 assign(fi,'hotel.in');
  assign(fo,'hotel.out');
 settextbuf(fi,b1); settextbuf(fo,b2);
 reset(fi); rewrite(fo); readln(fi,n,m); init(1,1,n);
  for i:=1 to m do begin
                    read(fi,op);
                    if op=3 then begin readln(fi); writeln(fo,a[1].maxt); end
                    else begin
                           readln(fi,x,y); y:=x+y-1;
                              if op=1 then ocupa(1,1,n) else elibereaza(1,1,n);
                           end;
                    end;
  close(fo);
end.