import java.io.*;
import java.util.*;

public class Dwite5 {
  public static void main(String[] args) throws IOException {
    new Dwite5().run();
  }
  int[][] m;
  boolean[][] check;
  boolean[][] cedcopy;
  int[][] w;
  public void run() throws IOException {
    Scanner s = new Scanner(new FileInputStream("DATA5.txt"));
    PrintStream out = new PrintStream(new FileOutputStream("OUT5.txt"));
    for(int i = 0; i < 5; i++) {
      int c = s.nextInt();
      int r = s.nextInt();
      m = new int[c][r];
      check = new boolean[c][r];
      w = new int[c][r];
      cedcopy = new boolean[c][r];
      for(int j = 0; j < c; j++) {
        for(int k = 0; k < r; k++) {
          m[j][k] = s.nextInt();
          check[j][k] = false;
          w[j][k] = 0;
          cedcopy[j][k] = false;
        }
      }
      int points = (c - 2) * (r - 2);
      while(points>0) {
        //find highest interior point
        int high = -1;
        int hc = 0;
        int hr = 0;
        for(int j = 1; j < c - 1; j++) {
          for(int k = 1; k < r - 1; k++) {
            //System.out.println("checking if " + m[j][k] + " is bigger than current best, " + high);
            if(m[j][k] > high && check[j][k] == false) {
              high = m[j][k];
              hc = j;
              hr = k;
            }
          }
        }
        //floodfill from that point, finding highest barrier
        for(int j = 0; j < c; j++) {
          for(int k = 0; k < r; k++) {
            cedcopy[j][k] = false;
          }
        }
        int n = ff(hc, hr, high, cedcopy.clone());
          //System.out.println("highest barrier at " + hc + " " + hr + " is " + n + " and this is " + high);
        if(n != -1) {
          w[hc][hr] = n - high;
        }
        check[hc][hr] = true;
        points--;
      }
      //find sum of water
      int totalwater = 0;
      for(int j = 1; j < c - 1; j++) {
        for(int k = 1; k < r - 1; k++) {
          if(w[j][k] > 0) {
            totalwater += w[j][k];
          }
        }
      }
      out.println(totalwater);
    }
  }
  //floodfills froms a point (with height sh), returns -1 if off edge
  int ff(int c, int r, int sh, boolean[][] ced) {
    ced=ced.clone();
    ced[c][r] = true;
    int low = 51;
    if(c > 0) {
      if(!ced[c - 1][r]) {
        if(m[c - 1][r] <= sh || w[c - 1][r] > 0) {
          low = (int)Math.min(low, ff(c - 1, r, sh, ced));
        } else {
          low = (int)Math.min(low, m[c - 1][r]);
        }
      }
    } else {
      return -1;
    }
    if(c < m.length - 1) {
      if(!ced[c + 1][r]) {
        if(m[c + 1][r] <= sh || w[c + 1][r] > 0) {
          low = (int)Math.min(low, ff(c + 1, r, sh, ced));
        } else {
          low = (int)Math.min(low, m[c + 1][r]);
        }
      }
    } else {
      return -1;
    }
    if(r > 0) {
      if(!ced[c][r - 1]) {
        if(m[c][r - 1] <= sh || w[c][r - 1] > 0) {
          low = (int)Math.min(low, ff(c, r - 1, sh, ced));
        } else {
          low = (int)Math.min(low, m[c][r - 1]);
        }
      }
    } else {
      return -1;
    }
    if(r < m[0].length - 1) {
      if(!ced[c][r + 1]) {
        if(m[c][r + 1] <= sh || w[c][r + 1] > 0) {
          low = (int)Math.min(low, ff(c, r + 1, sh, ced));
        } else {
          low = (int)Math.min(low, m[c][r + 1]);
        }
      }
    } else {
      return -1;
    }
    return low;
  }
}
