function add(var r: PNode; v: integer; level: integer = 0): integer;
var
rest, vtmp: integer;
q, pa, pb, pc: PNode;
begin
if r = nil then begin
new(r);
r^.left := nil;
r^.right := nil;
r^.v := v;
add := random(level div 2);
exit;
end;
if v = r^.v then begin
add := 0;
exit;
end;
if v < r^.v then begin
rest := add(r^.left, v, level + 1);
if rest > 0 then begin
//левое вращение
q := r^.left;
pa := q^.left;
pb := q^.right;
pc := r^.right;
vtmp := r^.v; r^.v := q^.v; q^.v := vtmp;
r^.left := pa;
r^.right := q;
q^.left := pb;
q^.right := pc;
end;
add := rest - 1;
end else begin
rest := add(r^.right, v, level + 1);
if rest > 0 then begin
//правое вращение
q := r^.right;
vtmp := r^.v; r^.v := q^.v; q^.v := vtmp;
pa := r^.left;
pb := q^.left;
pc := q^.right;
vtmp := r^.v; r^.v := q^.v; q^.v := vtmp;
r^.left := q;
q^.left := pa;
q^.right := pb;
r^.right := pc;
end;
add := rest - 1;
end;
end;