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.