#include<iostream>
#include<cstdio>

struct P{
	int x, y;
};

int W, H, n;
int made;
int memo[16], res[15][15];
P pos[16];

//i番目を置くよー
void rec(int map[15][15], int used, int x, int y){
	if(y == H){//できたよー
		made++;
		for(int i=0;i<H;i++){
			for(int k=0;k<W;k++){
				res[i][k] = map[i][k];
			}
		}
	}

	if(map[y][x] != 0){
		rec(map, used, (x+1)%W, (x+1)%W?y:y+1);
	}

	for(int j=1;j<=n;j++){
		if(!(used >> j & 1)){
			for(int width=1;width<=memo[j];width++){
				if(memo[j] % width != 0)continue;

				int height = memo[j] / width,
					x1 = x + width - 1,
					y1 = y + height - 1,
					_map[15][15];
				if(x <= pos[j].x && pos[j].x <= x1 &&
					 y <= pos[j].y && pos[j].y <= y1 &&
					 x1 < W && y1 < H){
					for(int i=0;i<H;i++){
						for(int k=0;k<W;k++){
							_map[i][k] = map[i][k];
						}
					}

					for(int i=0;i<height;i++){
						for(int k=0;k<width;k++){
							_map[y+i][x+k] = j;
						}
					}
					rec(_map, used | (1 << j), (x+width)%W, (x+width)%W?y:y+1);
				}
			}	
		}
	}

	return;
}

int main(){
	while(std::cin >> W >> H >> n, W){
		for(int i=0;i<n;i++){
			int index;
			std::cin >> index;
			std::cin >> memo[index];
		}

		for(int y=0;y<H;y++){
			for(int x=0;x<W;x++){
				int v;
				std::cin >> v;
				if(v != 0){
					pos[v] = {x, y};
				}
			}
		}

		int map[15][15];
		for(int i=0;i<225;i++){
			map[i/15][i%15] = 0;
		}

		made = 0;

		rec(map, 0, 0, 0);

		if(made == 1){
			for(int i=0;i<H;i++){
				printf("%d", res[i][0]);
				for(int j=1;j<W;j++){
					printf(" %d", res[i][j]);
				}
				puts("");
			}
		}else{
			std::cout << "NA" << std::endl;
		}
	}
}