// 2011/01/07 Tazoe

#include <iostream>
using namespace std;

bool DFS(int X, int Y, int n, int bk[15][2], int s[10][10], int& cnt, int ans[10][10])
{
	if(n==0){
		for(int y=0; y<Y; y++)
			for(int x=0; x<X; x++)
				if(s[y][x]==0)
					return false;

		cnt++;
		for(int y=0; y<Y; y++)
			for(int x=0; x<X; x++)
				ans[y][x] = s[y][x];
		return true;
	}

	int bx;
	int by;
	bool flg = false;
	for(by=0; by<Y; by++){
		for(bx=0; bx<X; bx++){
			if(s[by][bx]==bk[n-1][0])
				flg = true;
			if(flg)
				break;
		}
		if(flg)
			break;
	}

	for(int kY=1; kY<=bk[n-1][1]; kY++){
		if(bk[n-1][1]%kY!=0)
			continue;

		int kX = bk[n-1][1]/kY;

		for(int i=0; i<kY; i++)
			for(int j=0; j<kX; j++){
				int tmp[10][10];
				for(int y=0; y<Y; y++)
					for(int x=0; x<X; x++)
						tmp[y][x] = s[y][x];

				bool flg2 = true;
				int my = by-i;
				for(int mm=0; mm<kY; mm++){
					int nx = bx-j;
					for(int nn=0; nn<kX; nn++){
						if((my>=0&&my<Y)
						 &&(nx>=0&&nx<X)
						 &&(s[my][nx]==0||s[my][nx]==bk[n-1][0]))
							tmp[my][nx] = bk[n-1][0];
						else
							flg2 = false;
						if(!flg2)
							break;
						nx++;
					}
					if(!flg2)
						break;
					my++;
				}

				if(flg2)
					DFS(X, Y, n-1, bk, tmp, cnt, ans);
			}
	}

	return false;
}

int main()
{
	while(true){
		int X, Y, n;
		cin >> X >> Y >> n;
		if(X==0&&Y==0&&n==0)
			break;

		int bk[15][2];
		for(int i=0; i<n; i++)
			cin >> bk[i][0] >> bk[i][1];

		int s[10][10];
		for(int y=0; y<Y; y++)
			for(int x=0; x<X; x++)
				cin >> s[y][x];

		int cnt = 0;
		int ans[10][10];
		for(int y=0; y<Y; y++)
			for(int x=0; x<X; x++)
				ans[y][x] = -1;

		DFS(X, Y, n, bk, s, cnt, ans);

		if(cnt==1)
			for(int y=0; y<Y; y++)
				for(int x=0; x<X; x++){
					cout << ans[y][x];
					if(x!=X-1)
						cout << ' ';
					else
						cout << endl;
				}
		else
			cout << "NA" << endl;
	}

	return 0;
}