program serie1644rel; const MAX=1024; type node=record { uzel ve stromě } id:integer; val:real; end; var tree:array[1..MAX] of node; place:array[1..MAX div 2] of integer;{ umístění konců úseček } N,N2,i,poc_prusec:integer; procedure sort(a,b:integer); { QuickSort } var i,j:integer; pivot:real; pom:node; begin i:=a;j:=b;pivot:=tree[(a+b) div 2].val; while(i<=j) do begin while(tree[i].valpivot) do Dec(j); if (ii) then sort(i,b); end; procedure repair(i:integer); { opraví strom z daného listu } begin while(i>1) do begin i:=i div 2; tree[i].val:=tree[2*i].val+tree[2*i+1].val; end; end; function value(i:integer):integer;{ vrací počet otevřených cest od začátku k i } var pom:real; begin pom:=tree[i].val;{ krajní bod tam patří také } while (i>1) do begin if (i mod 2 = 1) then pom:=pom+tree[i-1].val; { je-li pravý syn, tak hodnota levého značí kolik konců nebo začátků leží uvnitř intervalu, tím vlastně získáme počet začátků, které nejsou uzavřeny. Protože začátků bude alespoň tolik, kolik konců, vyjde kladné číslo } i:=i div 2; end; value:=round(pom); end; begin writeln('Zadej pocet krtin');readln(fin,N); N2:=1; while N20) then begin if (place[tree[i].id]=0) then begin { je to začátek tunelu } tree[i].val:=-1;{ jeho hodnota je nám už k ničemu, teď značí konec } place[tree[i].id]:=i;{ kde je konec } end else tree[i].val:=1; { začátek tunelu } end; end; for i:= N2-1 downto 1 do { naplnění stromu } tree[i].val:=tree[2*i].val+tree[2*i+1].val; for i:=N2 to 2*N2-1 do begin if tree[i].id<>0 then begin poc_prusec:=poc_prusec+value(place[tree[i].id]); tree[place[tree[i].id]].id:=0;{ } tree[place[tree[i].id]].val:=0;{ neutralní hodnota nic neovlivní } repair(place[tree[i].id]);{ opravi strom v místě konce } tree[i].val:=0; repair(i);{ oprava v místě začátku tunelu } end; end; writeln('Bude treba ',poc_prusec,' zizal.'); end.