Ребят не могли бы вы подсказать какая ошибка в моем варианте написания двумерного дерева. Заранее спасибо.
var
b,a,t:array[0..100,0..100]of byte;
mini,minj,z,i,n,m,j,mid:longint;
function mi(a,b:longint):longint;
begin
if a<b then mi:=a else mi:=b;
end;
function ma(a,b:longint):longint;
begin
if a>b then ma:=a else ma:=b;
end;
procedure byild_y(no,l,r,noy,ly,ry:longint);
var
mid:longint;
begin
if ly=ry then
begin
if l=r then t[no,noy]:=a[l,ly]
else
t[no,noy]:=mi(t[no*2,noy],t[no*2+1,noy]);
end else
begin
mid:=(ly+ry) shr 1;
byild_y(no,l,r,noy*2,ly,mid);
byild_y(no,l,r,noy*2+1,mid+1,ry);
t[no,noy]:=mi(t[no,noy*2],t[no,noy*2+1]);
end;
end;
procedure byild_x(no,l,r:longint);
var
mid:longint;
begin
if l<>r then
begin
mid:=(l+r) shr 1;
byild_x(no*2,l,mid);
byild_x(no*2+1,mid+1,r);
exit;
end;
byild_y(no,l,r,1,1,m);
end;
procedure sum_x(no,noy,l,r,le,ri:longint);
var
mid:longint;
begin
if le>ri then exit;
if (l=le)and(r=ri) then
begin
z:=mi(z,t[noy,no]);
exit;
end;
mid:=(l+r) shr 1;
sum_x(no,noy*2,l,mid,le,mi(mid,ri));
sum_x(no,noy*2+1,mid+1,r,ma(le,mid+1),ri);
end;
procedure sum_y(no,l,r,le,ri:longint);
var
mid:longint;
begin
if le>ri then exit;
if (l=le)and(r=ri) then
begin
sum_x(no,1,1,n,mini+minj-l+1,n);
exit;
end;
mid:=(l+r) shr 1;
sum_y(no*2,l,mid,le,mi(ri,mid));
sum_y(no*2+1,mid+1,r,ma(le,mid+1),ri);
end;
begin
assign(input,'a.in');
reset(input);
assign(output,'a.out');
rewrite(output);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do read(a[i,j]);
readln;
end;
byild_X(1,1,n);
for i:=1 to n do for j:=1 to m do
begin
mini:=i;
minj:=j;
z:=maxlongint;
sum_y(1,1,m,j,m);
b[i,j]:=z;
end;
end.