#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cmath>
#include <cassert>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <numeric>
#include <complex>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <utility>
#include <functional>
#include <iterator>

using namespace std;

#define dump(n) cerr<<"# "<<#n<<"="<<(n)<<endl
#define repi(i,a,b) for(int i=int(a);i<int(b);i++)
#define peri(i,a,b) for(int i=int(b);i-->int(a);)
#define rep(i,n) repi(i,0,n)
#define per(i,n) peri(i,0,n)
#define iter(c) __typeof__((c).begin())
#define foreach(i,c) for(iter(c) i=(c).begin();i!=(c).end();++i)
#define all(c) (c).begin(),(c).end()
#define mp make_pair

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;
typedef pair<int,int> pii;

template<class T>
ostream& operator<<(ostream& os,const vector<T>& a)
{
	os<<'[';
	rep(i,a.size())
		os<<(i?" ":"")<<a[i];
	return os<<']';
}

bool canput(vvi& grid,int x,int y,int bw,int bh,int index)
{
	int h=grid.size(),w=grid[0].size();
	if(x<0 || w<x+bw || y<0 || h<y+bh)
		return false;
	bool flg=false;
	rep(i,bh) rep(j,bw){
		int cell=grid[y+i][x+j];
		if(cell!=-1 && cell!=index)
			return false;
		flg|=cell==index;
	}
	return flg;
}

void put(vvi& grid,int x,int y,int bw,int bh,int index)
{
	rep(i,bh) rep(j,bw)
		grid[y+i][x+j]=index;
}

vvi res;
int solve(vvi& grid,const vi& bs,const vi& ks,const vector<pii>& ps,int index)
{
	if(index==bs.size()){
		if(res.empty())
			res=grid;
		return 1;
	}
	
	int x=ps[index].first,y=ps[index].second;
	int area=ks[index];
	int res=0;
	repi(bh,1,area+1) if(area%bh==0){
		int bw=area/bh;
		rep(i,bh) rep(j,bw){
			int left=x-j,top=y-i;
			if(canput(grid,left,top,bw,bh,index)){
				put(grid,left,top,bw,bh,index);
				res+=solve(grid,bs,ks,ps,index+1);
				put(grid,left,top,bw,bh,-1);
				grid[y][x]=index;
			}
		}
	}
	return res;
}

int main()
{
	for(int w,h,n;cin>>w>>h>>n,w|h|n;){
		vi bs(n),ks(n);
		rep(i,n) cin>>bs[i]>>ks[i];
		
		vvi grid(h,vi(w));
		rep(i,h) rep(j,w) cin>>grid[i][j];
		
		if(accumulate(all(ks),0)!=w*h){
			cout<<"NA"<<endl;
			continue;
		}
		
		vector<pii> ps(n);
		rep(i,h) rep(j,w){
			if(grid[i][j]==0)
				grid[i][j]=-1;
			else{
				grid[i][j]=find(all(bs),grid[i][j])-bs.begin();
				ps[grid[i][j]]=mp(j,i);
			}
		}
		
		res.clear();
		int cnt=solve(grid,bs,ks,ps,0);
		if(cnt!=1)
			cout<<"NA"<<endl;
		else
			rep(i,h) rep(j,w)
				cout<<bs[res[i][j]]<<(j==w-1?'\n':' ');
	}
	
	return 0;
}