<m.cc>=
#include <iostream>
#include <string>
#include <stdlib.h>
// Deja vu c++ style.
  static std::string read_unsigned(std::istream &, unsigned &, const char * const)
  static std::string read_signed(std::istream &, int &, const char * const)
static void
do_err(const std::string & emsg) 
  // If the given error message is non-empty, print it and die.  Otherwise do
  // nothing.
  if not emsg.empty()
    std::cerr << "!!! " << emsg << ".\n"
    exit(EXIT_FAILURE)
int
main() 
  unsigned h, w
  do_err(read_unsigned(std::cin, h, "height"))
  do_err(read_unsigned(std::cin, w, "width"))
  unsigned cnt = h*w
  int * elevations = new int [cnt]
  for unsigned i = 0; i < cnt; i++
    do_err(read_signed(std::cin, elevations[i], "elevation"))
  unsigned rainfall
  do_err(read_unsigned(std::cin, rainfall, "rainfall"))
  delete [] elevations
static std::string
read_signed(std::istream & ins, int & value, const char * const what) 
  // Read an int from the given input stream; store the value read in the
  // given pointer.  Return true if no errors occurred, false otherwise.
  ins >> value
  if ins.eof()
    return std::string("Unexpected eof; ") + what + " expected"
  if ins.fail()
    return std::string("Unexpected value; integer ") + what + " expected"
  if ins.bad()
    return std::string("Unrecoverable I-O error occurred during ") + what + " read"
                      
  return ""
static std::string
read_unsigned(std::istream & ins, unsigned & value, const char * const what) 
  // Read an int from the given input stream; store the value read in the
  // given pointer.  Return true if no errors occurred, false otherwise.
  // This code isn't correct: the largest unsigned value is too large to fit in
  // a signed integer.  The fix is to read into a double-sized signed, check
  // the size, and then cast down to a single-sized unsigned if appropriate.
  // Consider it done.
  int i
  std::string emsg = read_signed(ins, i, what)
  if not emsg.empty()
    return emsg
  if i < 0
    return std::string("Negative ") + what + " value read, non-negative value expected"
  value = static_cast<unsigned>(i)
  return ""
Definesm.cc(links are to index).This code is written to a file (or else not used).