#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int X,Y,N;
int b[100], k[100];
int c[10][10], f[10][10];
int ans[10][10];
int cnt;

vector<int> bx[101],by[101];

bool isputs(int x, int y, int n, int a, int b)
{
	if(x+bx[a][b] > X || y+by[a][b] > Y) return false;

	for(int i=y; i<y+by[a][b]; i++)
	for(int j=x; j<x+bx[a][b]; j++)
	{
		if(c[j][i]!=0 && c[j][i]!=n) return false;
		if(f[j][i]!=0) return false;

		f[j][i]=n;
	}
	
	return true;
}

bool dfs(int n)
{
	if(cnt>=2) return false;
	
	if(n==N) 
	{
		cnt++;
		memcpy(ans, f, sizeof(ans));
		return false;
	}

	int p=b[n], a=k[n];
	int t[10][10];
	memcpy(t,f,sizeof(t));

	for(int i=0; i<Y; i++)
	for(int j=0; j<X; j++)
	for(int l=0; l<bx[a].size(); l++)	
	{
		if(isputs(j,i,p,a,l)) dfs(n+1);

		memcpy(f,t,sizeof(f));
	}
	
	return false;
}


int main()
{
	for(int x=1; x<=10; x++)
	for(int y=1; y<=10; y++)
	{
		int n=x*y;
		bx[n].push_back(x);
		by[n].push_back(y);
	}

	while(cin >> X >> Y >> N, (X||Y||N))
	{
		cnt=0;
		for(int i=0; i<N; i++)
			cin >> b[i] >> k[i];
	
		for(int i=0; i<Y; i++)
		for(int j=0; j<X; j++)
			cin >> c[j][i];

		memset(f,0,sizeof(f));
		
		dfs(0);
		if(cnt == 1)
		{
			for(int i=0; i<Y; i++)
			{
				for(int j=0; j<X; j++)
					cout << ans[j][i] << " ";
				cout << endl;
			}
		}
		else cout << "NA" << endl;
	}
		
}