#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int field[11][11];
int land[20];
pair<int,int> place[20];

int w,h,n;
bool ok;

struct landInfo{
	int minx;
	int miny;
	int maxy;
	int maxx;
};

landInfo mem[20];

bool no=false;

void dfs(int num,int sum){
	if(no)
		return;
	if(num==n+1){
		if(sum==h*w){
			if(ok){
				no=true;
			}
			else{
				ok=true;
			}
		}
		return;
	}
	else{
		// ßûð·×ÄµÄÝé
		for(int i = 1; i <= land[num]; i++){
			if(land[num]%i!=0)
				continue;
			int tate=i;
			int yoko=land[num]/i;
			// Ç±É»ÝÌynÌÔÌÊuðÁÄ­é©
			for(int j = 0; j < tate; j++){
				for(int k = 0; k < yoko; k++){
//					if(mem[1].minx==0&&j==1&&k==0&&tate==2&&num==2){
////						cout<<endl;
//					}
					// ÍÝoÄÈ¯êÎAßé
					int minx=place[num].second-k;
					int miny=place[num].first-j;
					int maxx=minx+yoko-1;
					int maxy=miny+tate-1;
					if(minx>=0&&miny>=0&&minx<w&&miny<h&&maxx>=0&&maxy>=0&&maxx<w&&maxy<h){
						// àµ¼ÌynÌÍÍÆðíÁÄ¢È¯êÎ
						vector<pair<int,int> > ps;
						ps.push_back(make_pair(miny,minx));
						ps.push_back(make_pair(miny,maxx));
						ps.push_back(make_pair(maxy,minx));
						ps.push_back(make_pair(maxy,maxx));

						bool f=false;
						for(int l = 1; l < num; l++){
							if((maxx<mem[l].minx||maxy<mem[l].miny)||(minx>mem[l].maxx||miny>mem[l].maxy)){

							}
							else{
								f=true;
								break;
							}
							//for(int m = 0; m < ps.size(); m++){
							//	if(ps[m].first>=mem[l].miny&&mem[l].maxy>=ps[m].first&&
							//		ps[m].second>=mem[l].minx&&mem[l].maxx>=ps[m].second){
							//			f=true;
							//			break;
							//	}
							//}
							//if(f)
							//	break;
						}
						if(!f){
							if(num==4){
							//	cout<<endl;
							}
							landInfo li;
							li.minx=minx;
							li.maxx=maxx;
							li.miny=miny;
							li.maxy=maxy;
							mem[num]=li;
							dfs(num+1,sum+land[num]);
							if(no)
								return;
							//if(ok)
							//	return;
						}
					}
				}
			}
		}
	}
}

int main(){
	while(cin>>w>>h>>n&&!(w==0&&h==0&&n==0)){
		ok=false;
		no=false;
		int b,k;
		for(int i = 0; i < n; i++){
			cin>>b>>k;
			land[b]=k;
		}
		for(int i = 0; i < h; i++){
			for(int j = 0; j < w; j++){
				cin>>field[i][j];
				if(field[i][j]!=0){
					place[field[i][j]].first=i;
					place[field[i][j]].second=j;
				}
			}
		}
		// ÔÉynðßÄ¢­
		dfs(1,0);
		if(ok&&!no){
			for(int i = 1; i <= n; i++){ 
				for(int j = mem[i].miny; j <= mem[i].maxy; j++){
					for(int k = mem[i].minx; k <= mem[i].maxx; k++){
						field[j][k]=i;
					}
				}
			}
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){
					cout<<field[i][j];
					if(j!=w-1)
						cout<<" ";
				}
				cout<<endl;
			}
		}
		else
			cout<<"NA"<<endl;
	}

	return 0;
}