#!/usr/bin/perl
#!/usr/bin/perl
use strict;
use warnings;

my @I;        # Исходная матрица
my @W;        # Рабочая матрица
my ($MX,$MY); # Размеры матрицы
while(<DATA>) {  # Читаем исходую матрицу
  my @row=();
  chomp;
  last if(!$_);
  push @row, $_ for split / +/;
  push @I, \@row;
  $MX=@row; $MY++;  # Запоминаем размеры
  my @row2=();      # И заполняем начальными значениями рабочую
  push @row2,10000 for(1..$MX);
  push @W, \@row2;
}
$MX--; $MY--;
# обходим все 4 стороны прямоугольника
cell(0,$_,0)   for(1..$MY);
cell($MX,$_,0) for(1..$MY);
cell($_,0,0)   for(1..$MX);
cell($_,$MY,0) for(1..$MX);

# Печать результирующей матрицы и расчет объема воды
my $summ=0;
my $y=0;
for(@W) {
  $,=" ";
  print "@$_\n";
  for my $x(0..$MX) { $summ+=$W[$y][$x]-$I[$y][$x]; }
  $y++;
}

print "RESULT = $summ\n";

# Основная рабочая, рекурсивная функция
sub cell {
  my($x, $y, $lev)=@_;
  return if($x<0 || $y<0 || $x>$MX || $y>$MY);  # Проверяем выход за пределы поля
  return if($W[$y][$x]<=$lev);    # Максимум клетки ниже или равен - мы тут были
  $lev=$I[$y][$x] if($lev < $I[$y][$x]);  # Повышаем текущий уровень, если ниже изначального для клетки
  $W[$y][$x]=$lev;    # Устанавливаем текущий максимум
  cell($x-1,$y,$lev); # И обходим всех 4х соседей рекурсивно
  cell($x+1,$y,$lev);
  cell($x,$y-1,$lev);
  cell($x,$y+1,$lev);
}

__DATA__
5 3 4 5
6 2 1 4
3 1 1 4
8 5 5 3
8 3 1 6
8 4 5 8
