Теоретический материал

{$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.