bolivar1997's blog

By bolivar1997, 11 years ago, In Russian

Ребят не могли бы вы подсказать какая ошибка в моем варианте написания двумерного дерева. Заранее спасибо.

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.

  • Vote: I like it
  • -31
  • Vote: I do not like it