Problem: 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”.

Example

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

Yes
No
No
No
Yes

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 21


int H,W,CAP,num_resident;
int diff_row[4] = {-1,0,0,1},diff_col[4] = {0,-1,1,0};
int height[NUM][NUM],pool;
bool exist[NUM][NUM],visited[NUM][NUM],Area_FLG;
set<int> SET;

bool rangeCheck(int row,int col){
	if(row >= 0 && row <= H-1 && col >= 0 && col <= W-1)return true;
	else{
		return false;
	}
}

void searchArea(int row,int col,int base_height){

	visited[row][col] = true;
	pool += base_height-height[row][col];

	if(row == 0 || row == H-1 || col == 0 || col == W-1 || exist[row][col] == true){
		Area_FLG = false;
	}
	int next_row,next_col;
	for(int i = 0; i < 4; i++){
		next_row = row+diff_row[i];
		next_col = col+diff_col[i];
		if(rangeCheck(next_row,next_col) == false || visited[next_row][next_col] == true ||
				height[next_row][next_col] >= base_height)continue;

		searchArea(next_row,next_col,base_height);
	}
}

bool is_ok(int base_height){

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++)visited[row][col] = false;
	}
	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			if(visited[row][col] == true || height[row][col] >= base_height)continue;

			pool = 0;
			Area_FLG = true;

			searchArea(row,col,base_height);

			if(Area_FLG == true && pool >= CAP){
				return true;
			}
		}
	}
	return false;
}

void func(){

	SET.clear();

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			scanf("%d",&height[row][col]);
			SET.insert(height[row][col]);
		}
	}
	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++)exist[row][col] = false;
	}

	int tmp_row,tmp_col;
	for(int loop = 0; loop < num_resident; loop++){
		scanf("%d %d",&tmp_row,&tmp_col);
		tmp_row--;
		tmp_col--;
		exist[tmp_row][tmp_col] = true;
	}

	int tmp_height;
	for(auto it = SET.begin(); it != SET.end(); it++) {

		tmp_height = *it;

		if(is_ok(tmp_height)){
			printf("Yes\n");
			return;
		}
	}

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			if(exist[row][col])continue;

			height[row][col]++;
			if(is_ok(height[row][col])){
				printf("Yes\n");
				return;
			}
			height[row][col]--;
		}
	}
	printf("No\n");
}

int main(){

	while(true){
		scanf("%d %d %d %d",&H,&W,&CAP,&num_resident);
		if(H == 0 && W == 0 && CAP == 0 && num_resident == 0)break;

		func();
	}

	return 0;
}