// Prof. carlos Maziero, DINF-UFPR, Maio de 2016

program pgm;

type
  matriz = array [1..1000, 1..1000] of byte ;

//=================================================================

procedure le_imagem (var m: matriz; var lin, col, max : integer) ;
var
  i, j : integer ;
  header : string ;

begin
  read (header) ;
  read (col, lin, max) ;

  for i := 1 to lin do
    for j:= 1 to col do
      read (m[i,j]) ;
end ;

//=================================================================

procedure escreve_imagem (var m: matriz; lin, col, max : integer) ;
var
  i, j : integer ;

begin
  writeln ('P2') ;
  writeln (col, ' ', lin, ' ', max) ;

  for i := 1 to lin do
    for j:= 1 to col do
      writeln (m[i,j]) ;
end ;

//=================================================================

procedure negat_imagem (var m: matriz; lin, col, max : integer) ;
var
  i, j : integer ;

begin
  for i := 1 to lin do
    for j:= 1 to col do
      m[i,j] := max - m[i,j] ;
end ;

//=================================================================

procedure limiar_imagem (var m: matriz; lin, col, max : integer;
                         limiar : real) ;
var
  i, j : integer ;

begin
  for i := 1 to lin do
    for j:= 1 to col do
      if (m[i,j] >= limiar*max) then
        m[i,j] := max 
      else
        m[i,j] := 0 ;
end ;

//=================================================================

procedure media_imagem (var m: matriz; lin, col, max : integer) ;
var
  i, j : integer ;
  m2   : matriz ;

begin
  for i := 2 to lin-1 do
    for j:= 2 to col-1 do
      m2[i,j] := round (( m[i-1,j-1] + m[i-1,j] + m[i-1,j+1] +
                   m[i,j-1] + m[i,j] + m[i,j+1] +
                   m[i+1,j-1] + m[i+1,j] + m[i+1,j+1] ) / 9 ) ;
  m := m2 ;
end ;

//=================================================================

procedure mediana_imagem (var m: matriz; lin, col, max : integer) ;
var
  i, j, x, y : integer ;
  m2   : matriz ;
  v    : array [1..9] of byte ;
  aux  : byte ;

begin
  for i := 2 to lin-1 do
    for j:= 2 to col-1 do
    begin
      v[1] := m[i-1,j-1] ;
      v[2] := m[i-1,j] ;
      v[3] := m[i-1,j+1] ;
      v[4] := m[i,j-1] ;
      v[5] := m[i,j] ;
      v[6] := m[i,j+1] ;
      v[7] := m[i+1,j-1] ;
      v[8] := m[i+1,j] ;
      v[9] := m[i+1,j+1] ;

      // sort
      for x := 1 to 9 do
        for y := x+1 to 9 do
          if (v[y] < v[x]) then
          begin
            aux  := v[x] ;
            v[x] := v[y] ;
            v[y] := aux ;
          end ; 

      m2[i,j] := v[5] ;
    end ;
  m := m2 ;
end ;

//=================================================================

var
  img : matriz ;
  lin, col, max : integer ;

begin
  le_imagem (img, lin, col, max) ;
//  negat_imagem (img, lin, col, max) ;
//  limiar_imagem (img, lin, col, max, 0.2) ;
//  media_imagem (img, lin, col, max) ;
  mediana_imagem (img, lin, col, max) ;
  escreve_imagem (img, lin, col, max) ;
end.

