Problem:
Problem E: Black Force

A dam construction project was designed around an area called Black Force. The area is surrounded by
mountains and its rugged terrain is said to be very suitable for constructing a dam.

However, the project is now almost pushed into cancellation by a strong protest campaign started by the
local residents. Your task is to plan out a compromise proposal. In other words, you must find a way to
build a dam with sufficient capacity, without destroying the inhabited area of the residents.

The map of Black Force is given as H × W cells (0 < H, W ≤ 20). Each cell hi, j is a positive integer
representing the height of the place. The dam can be constructed at a connected region surrounded
by higher cells, as long as the region contains neither the outermost cells nor the inhabited area of the
residents. Here, a region is said to be connected if one can go between any pair of cells in the region
by following a sequence of left-, right-, top-, or bottom-adjacent cells without leaving the region. The
constructed dam can store water up to the height of the lowest surrounding cell. The capacity of the dam
is the maximum volume of water it can store. Water of the depth of 1 poured to a single cell has the
volume of 1.

The important thing is that, in the case it is difficult to build a sufficient large dam, it is allowed to
choose (at most) one cell and do groundwork to increase the height of the cell by 1 unit. Unfortunately,
considering the protest campaign, groundwork of larger scale is impossible. Needless to say, you cannot
do the groundwork at the inhabited cell.

Given the map, the required capacity, and the list of cells inhabited, please determine whether it is possible
to construct a dam.

Input

The input consists of multiple data sets. Each data set is given in the following format:

H W C R
h1,1 h1,2 . . . h1,W
...
hH,1 hH,2 . . . hH,W
y1 x1
...
yR xR

H and W is the size of the map. is the required capacity. R (0 < R < H × W) is the number of cells
inhabited. The following H lines represent the map, where each line contains W numbers separated by
space. Then, the R lines containing the coordinates of inhabited cells follow. The line “y x” means that
the cell hy,x is inhabited.

The end of input is indicated by a line “0 0 0 0”. This line should not be processed.

Output

For each data set, print “Yes” if it is possible to construct a dam with capacity equal to or more than C.
Otherwise, print “No”.

Sample Input

4 4 1 1
2 2 2 2
2 1 1 2
2 1 1 2
2 1 2 2
1 1
4 4 1 1
2 2 2 2
2 1 1 2
2 1 1 2
2 1 2 2
2 2
4 4 1 1
2 2 2 2
2 1 1 2
2 1 1 2
2 1 1 2
1 1
3 6 6 1
1 6 7 1 7 1
5 1 2 8 1 6
1 4 3 1 5 1
1 4
5 6 21 1
1 3 3 3 3 1
3 1 1 1 1 3
3 1 1 3 2 2
3 1 1 1 1 3
1 3 3 3 3 1
3 4
0 0 0 0

Output for the Sample Input

Yes
No
No
No
Yes

Solution in C++ (judge verdict: Compile Error)

#include<iostream>
#include<vector>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
const int W = 20,H = 20;

int vol;
bool vis[H][W];
bool liv[H][W];
int    h[H][W];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};


void dfs(int r,int c,int y,int x,int water,bool &flag){
  if (x ==0 || y == 0 || x == c-1||y==r-1||liv[y][x]){
    flag=false;
  }
  if (vis[y][x])return ;
  vol+=water-h[y][x];
  vis[y][x]=true;
  
  rep(i,4){
    int nex=x+dx[i],ney=y+dy[i];
    if (nex == -1||ney==-1||nex==c||ney==r)continue;
    if (h[ney][nex] <water){
      dfs(r,c,ney,nex,water,flag);
    }
  }
  return;
}

bool compute(int r,int c,int C,int water){
  rep(i,r)rep(j,c)vis[i][j]=false;

  REP(i,1,r-1){
    REP(j,1,c-1){
      if (!vis[i][j] && h[i][j] < water){
	bool flag=true;
	vol=0;
	dfs(r,c,i,j,water,flag);
	//cout << i <<" " << j << " " <<flag <<" " <<  vol <<" " <<water << endl;
	if (flag&&vol >=C)return true;
      }
    }
  }
  return false;
}

bool solve(int r,int c,int C){
  rep(i,r){
    rep(j,c){
      h[i][j]++;
      vector<int> val(r*c);
      rep(ii,r)rep(jj,c)val[ii*c+jj]=h[i][j];
      sort(ALL(val));
      val.erase(unique(ALL(val)),val.end());
      rep(ii,val.size())if (compute(r,c,C,val[ii]))return true;
      h[i][j]--;
    }
  }
  return false;
}

main(){
  int r,c,C,R;
  while(cin>>r>>c>>C>>R && r){
    rep(i,r){
      rep(j,c){
	cin>>h[i][j];
	liv[i][j]=false;
      }
    }
    rep(i,R){
      int y,x;
      cin>>y>>x;y--;x--;
      liv[y][x]=true;
    }
    if (solve(r,c,C))cout <<"Yes"<<endl;
    else cout << "No"<<endl;
  }
  return false;
}