#include<bits/stdc++.h>
struct P{int x, y;};
int W, H, n;
int memo[16], res[10][10];
P pos[16];
using namespace std;

//i?????????????????????//used??§??????????????§?????£?????????????????????????????????
//?????????x??¨y??§???????????§????????§?????£???????????????????????????
int rec(int map[10][10], int used, int x, int y){
    if(y == H){//??§????????????
        for(int i=0;i<H;i++){
            for(int j=0;j<W;j++){
                res[i][j] = map[i][j];
            }
        }
        return 1;
    }
    int res = 0;
    if(map[y][x] != 0){//??????????????£?????????
        res += rec(map, used, (x+1)%W, (x+1)%W?y:y+1);
    }
    for(int i=1;i<=n;i++){//?????????i????????°??¶?????????
        if(used >> i & 1)continue;//???????????¨?????????????¬?????????????
        //memo?????£????????§?????????????????£?????????????????????
        for(int width=1;width<=memo[i];width++){
            //????????¢????????????????????¨???????¨???§?????£?????????
        	//??????????????§?????£??????????????§??????????????????????????????
        	if(memo[i] % width != 0)continue;
            //????????§????????¢?????????????????¶??????????????????
            int height = memo[i] / width, _map[10][10];
           //position????????\????????????????????????????????????-1??\???????????°???y???????????????
            //?????????????????????width????????????W,H??\???????????°???
            //map???????????\????????????????????????????????¶???if??????????????\??£???????????¨???????????????????????????
            if(x <= pos[i].x &&
            pos[i].x <= x + width - 1 &&
                 y <= pos[i].y &&
            pos[i].y <= y + height - 1 &&
                 x + width - 1 < W &&
                 y + height - 1 < H){
            	//?????????map???????????§?????£????????????????????????????????????
                for(int j=0;j<H;j++){
                    for(int k=0;k<W;k++){
                        _map[j][k] = map[j][k];
                    }
                }
                //_map[][]?????????????????¬?¨??????´??? map
                bool divided = true;
                for(int j=0;j<height&&divided;j++){
                    for(int k=0;k<width&&divided;k++){
                        if(_map[y+j][x+k] != 0)divided = false;//??????????????\?????????
                        _map[y+j][x+k] = i;
                    }
                }
                //????????´????????\????????¬????????????
                if(!divided)break;
                res += rec(_map, used | (1 << i), (x+width)%W, (x+width)%W?y:y+1);
            }
        }
    }
    return res;
}

int main(){
    while(cin >> W >> H >> n, W){
    	int index;int v;
    	for(int i=n;i--;){cin >> index; cin >> memo[index];}
    	for(int y=0;y<H;y++){for(int x=0;x<W;x++){cin >> v;if(v != 0){pos[v] = {x, y};}}}
    	//cin >> v;if(v != 0){pos[v] = {x, y};}}}
        int map[10][10];
        for(int i=0;i<100;i++){map[i/10][i%10] = 0;}

        if(rec(map, 0, 0, 0) == 1){
            for(int i=0;i<H;i++){
                cout << res[i][0];
                for(int j=1;j<W;j++){
                    cout << " " << res[i][j];
                }
                cout << endl;
            }
        }else{
            cout << "NA" << endl;
        }
    }
}