#include <stdio.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.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;

struct Data{
	Data(int arg_num1,int arg_num2){
		num1 = arg_num1;
		num2 = arg_num2;
	}
	int num1,num2;
};

struct Info{
	int tmp_table[10][10];
	int state;
};

struct Kanban{
	void set(int arg_row,int arg_col){
		row = arg_row;
		col = arg_col;
	}
	int row,col;
};

int H,W,N;
int table[16],POW[16];
int ans_table[10][10];
vector<Data> DATA[101];
Kanban kanban[16];


void func(){

	int id,area,sum_area = 0;
	for(int loop = 0; loop < N; loop++){
		scanf("%d %d",&id,&area);
		table[id] = area;
		sum_area += area;
	}

	Info first;
	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			scanf("%d",&first.tmp_table[row][col]);
			if(first.tmp_table[row][col] > 0){
				kanban[first.tmp_table[row][col]].set(row,col);
			}
		}
	}

	if(sum_area != H*W){
		printf("NA\n");
		return;
	}

	first.state = 0;

	int ans_num = 0;

	queue<Info> Q;
	Q.push(first);

	int finish = POW[N]-1;
	int kado_row,kado_col;
	bool FLG;
	int width,height;

	while(!Q.empty()){

		if(Q.front().state == finish){
			if(ans_num == 1){
				printf("NA\n");
				return;
			}
			ans_num = 1;
			for(int row = 0; row < H; row++){
				for(int col = 0; col < W; col++){
					ans_table[row][col] = Q.front().tmp_table[row][col];
				}
			}
			Q.pop();
		}else{
			kado_row = -1;
			for(int row = 0; row < H; row++){
				for(int col = 0; col < W; col++){
					if((Q.front().tmp_table[row][col] == 0) || (Q.front().state & (1 << (Q.front().tmp_table[row][col]-1))) == 0){
						kado_row = row;
						kado_col = col;
						break;
					}
				}
				if(kado_row != -1)break;
			}

			for(int loop = 1; loop <= N; loop++){
				if(Q.front().state & (1 << (loop-1)))continue;


				for(int i = 0; i < DATA[table[loop]].size(); i++){
					width = DATA[table[loop]][i].num1;
					height = DATA[table[loop]][i].num2;

					if(kado_row+height-1 >= H || kado_col+width-1 >= W)continue;
					if(kanban[loop].col < kado_col || kanban[loop].col > kado_col+width-1
							|| kanban[loop].row < kado_row || kanban[loop].row > kado_row+height-1)continue;

					FLG = true;

					for(int row = kado_row; row <= kado_row+height-1; row++){
						for(int col = kado_col; col <= kado_col+width-1; col++){
							if(Q.front().tmp_table[row][col] != 0 && Q.front().tmp_table[row][col] != loop){
								FLG = false;
								break;
							}
						}
						if(!FLG)break;
					}
					if(!FLG)continue;

					Info next_info;
					for(int row = 0; row < H; row++){
						for(int col = 0; col < W; col++)next_info.tmp_table[row][col] = Q.front().tmp_table[row][col];
					}
					for(int row = kado_row; row <= kado_row+height-1; row++){
						for(int col = kado_col; col <= kado_col+width-1; col++){
							next_info.tmp_table[row][col] = loop;
						}
					}
					next_info.state = Q.front().state+POW[loop-1];
					Q.push(next_info);
				}
			}
			Q.pop();
		}
	}

	if(ans_num == 1){
		for(int row = 0; row < H; row++){
			printf("%d",ans_table[row][0]);
			for(int col = 1; col < W; col++){
				printf(" %d",ans_table[row][col]);
			}
			printf("\n");
		}

	}else{
		printf("NA\n");
	}

}


int main(){

	for(int num = 1; num <= 100; num++){
		for(int k = 1; k <= num; k++){
			if(num%k == 0){
				DATA[num].push_back(Data(k,num/k));
			}
		}
	}

	for(int i = 0; i < 16; i++)POW[i] = pow(2,i);

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

		func();
	}

	return 0;
}