Теоретический материал
{$O-}
{$MAXSTACKSIZE 30000000}
program dec_tree;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
int=longint;
real=extended;
bool=boolean;
TKey=int;
PEl=^TEl;
TEl=record
key:TKey;
y:int;
L,R:PEl;
end;
TDecTree=object
root:PEl;
procedure Init;
procedure Add(const a:TKey);
function Search(const a:TKey):PEl;
procedure Delete(const a:TKey);
procedure Print;
end;
const
maxRand=1000000000;
mx=100000;
var
tr:TDecTree;
a:array[0..mx] of Bool;
i,t:int;
procedure TDecTree.Init;
begin
root:=nil;
end;
procedure Split(pt: PEl; key: TKey; var pL,pR:PEl);
begin
if pt=nil then
begin
pL:=nil;
pR:=nil;
end
else
if pt^.keypR^.y then
begin
p:=pL;
Merge(p^.R,p^.R,pR);
end
else
begin
p:=pR;
Merge(p^.L,pL,p^.L);
end
end;
procedure Delete1(var p:PEl; const A:TKey);
begin
if p=nil then
Writeln('No such element')
else
if A=p^.key then
Merge(p,p^.L,p^.R)
else
if Anil then
begin
Print1(P^.L);
Write(p^.key,' ');
Print1(P^.R);
end;
end;
procedure TDecTree.Print;
begin
Print1(root);
end;
procedure TDecTree.Delete(const a:TKey);
begin
Delete1(root,a);
end;
begin
Randomize;
RandSeed:=Random(1000);
// RandSeed:=722;
Writeln(RandSeed);
tr.Init;
fillchar(a,sizeof(a),0);
for i := 1 to 3*mx do
begin
t:=mx-i mod mx;
// t:=random(mx);
if a[t]<>(tr.Search(t)<>nil) then
Writeln(IntToStr(i) + ' 1'+'BAD!!!');
if a[t] then
tr.Delete(t)
else
tr.Add(t);
a[t]:=not a[t];
if a[t]<>(tr.Search(t)<>nil) then
Writeln(IntToStr(i) + ' 2'+'BAD!!!');
Writeln(i,' ok ', ord(a[t]));
// Write ('Added ', t, ' Now: ');
// tr.Print;
// readln;
// writeln;
end;
Readln;
end.