uses
  crt, windows;

{$define __BOKUL}
{ $define TEST_SMALL}

const
{$ifdef TEST_SMALL}
  r = 10;
  n = 5;
  m = 7;
{$else}
  r = 1200;
  n = 1100;
  m = 1200;
{$endif}

type
  rec = record
    i0, j0: integer;
  end;

  index = array[1..m*n] of rec;
  massiv = array[1..r] of integer;
  matrix = array[1..n, 1..m] of integer;

procedure merge(var ar: massiv; n: integer);

  procedure slit(k, q: Integer);
  var
    m: integer;
    i, j, T: integer;
    d: massiv;
  begin
    m := k + (q-k) div 2;
    i := k; j := Succ(m); t := 1;
    while (i <= m) and (j <= q) do begin
      if ar[i] <= ar[j] then begin
        d[T] := ar[i]; Inc(i)
      end
      else begin
        d[T] := ar[j]; Inc(j)
      end;
      Inc(T)
    end;

    while i <= m do begin
      d[T] := ar[i]; Inc(i); Inc(T)
    end;

    while j <= q do begin
      d[T] := ar[j]; Inc(j); Inc(T)
    end;

    for i := 1 to pred(T) do
      ar[Pred(k+i)] := d[i]
  end;

  procedure Sort(i, j: Integer);
  var T: integer;
  begin
    if i >= j then exit;

    if j - i = 1 then begin
      if ar[j] < ar[i] then begin
        T := ar[i]; ar[i] := ar[j]; ar[j] := T
      end
    end
    else begin
      Sort(i, i + (j-i) div 2);
      Sort(i + (j-i) div 2 + 1, j);
      Slit(i, j)
    end;
  end;

begin
  Sort(1, n);
end;

function bin_search(var x: array of integer;
         const n: Integer; Value: integer): Integer;
var nn, nFind, Right, Left: Integer;
begin
  Left := 0; Right := Pred(n);
  while (Right - Left) > 1 do begin
     nn := (Right + Left) div 2;

     if Value <= x[nn] then Right := nn else Left := nn

  end;
  if Value = x[Left] then nFind := Left
  else
    if Value = x[Right] then nFind := Right
    else nFind := -2;

  bin_search := nFind + 1;
end;


var
  mas: index;
  x: matrix; z: massiv;
  i, j, k: integer;
  count: integer;
  b: boolean;

  T: dword;

begin
  clrscr;
  for i:=1 to n do begin
    for j:=1 to m do begin
      x[i,j]:=random(10);
      {$ifdef TEST_SMALL}
        write(x[i,j],' ');
      {$endif}
    end;
    {$ifdef TEST_SMALL}
    writeln;
    {$endif}
  end;
  writeln('-------------------------------------');

  for k:=1 to r do begin
    z[k]:=random(10);
    {$ifdef TEST_SMALL}
      write(z[k],' ');
    {$endif}
  end;
  writeln;
  writeln('-------------------------------------');

  T := gettickcount();
  {$ifdef __BOKUL}

    writeln('Bokul:');
    b := false;
    count := 0;
    for i:=1 to n do
      for j:=1 to m do begin

        for k:=1 to r do
          if z[k]=x[i,j] then b:=true;
          if b = false then begin
            x[i,j]:=0;
            inc(count);
            mas[count].i0:=j;
            mas[count].j0:=i;
          end
          else
            b := false;
      end;

  {$else}
    writeln('Volvo:');
    merge(z, r);
    count := 0;
    for i := 1 to n do
      for j := 1 to m do begin
        if bin_search(z, r, x[i, j]) <> -1 then begin
          x[i, j] := 0;
          inc(count);
          with mas[count] do begin
            i0 := i; j0 := j;
          end;
        end;
      end;

  {$endif}
  writeln('Time = ', gettickcount() - T);
  writeln('count = ', count);

  {$ifdef TEST_SMALL}
    for i:= 1 to count do
      writeln('y=',mas[i].i0, ' x=',mas[i].j0,'|');
  {$endif}
  readln;
end.