#include <iostream>
#include <algorithm>

using namespace std;

int H, W, n, input[15], data[10][10], map[10][10], px[15], py[15];
bool ans;

bool check(int y, int x){
  if(y<0 || y>=H) return false;
  if(x<0 || x>=W) return false;
  return true;
}

bool settable(int y, int x, int h, int w){
  for(int i=y;i<y+h;i++){
    for(int j=x;j<x+w;j++){
      if(data[i][j]) return false;
    }
  }
  return true;
}

void setPanel(int y, int x, int h, int w, int p){
  for(int i=y;i<y+h;i++){
    for(int j=x;j<x+w;j++){
      data[i][j] = p;
    }
  }
}

bool finish(){
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      if(data[i][j] == 0) return false;
    }
  }
  return true;
}

bool solve(int p){
  if(p == -1){
    if(finish()){
      if(ans) return true;
      ans = true;
      for(int i=0;i<H;i++) for(int j=0;j<W;j++) map[i][j] = data[i][j];
    }
    return false;
  }
  for(int h=1;h<=input[p];h++){
    if(input[p] % h != 0) continue;
    int w = input[p] / h;
    for(int i=py[p]-h+1;i<=py[p];i++){
      for(int j=px[p]-w+1;j<=px[p];j++){
        if(!check(i, j)) continue;
        data[py[p]][px[p]] = 0;
        if(settable(i, j, h, w)){
          setPanel(i, j, h, w, p+1);
          if(solve(p-1)) return true;
          setPanel(i, j, h, w, 0);
        }
        data[py[p]][px[p]] = p+1;
      }
    }
  }
  return false;
}

main(){
  while(cin >> W >> H >> n && (W|H|n)){
    for(int i=0;i<n;i++){
      int a, b;
      cin >> a >> b;
      input[a-1] = b;
    }
    for(int i=0;i<H;i++){
      for(int j=0;j<W;j++){
        cin >> data[i][j];
        if(data[i][j] != 0){
          px[data[i][j]-1] = j;
          py[data[i][j]-1] = i;
        }
      }
    }
    ans = false;
    if(!solve(n-1) && ans){
      for(int i=0;i<H;i++){
        cout << map[i][0];
        for(int j=1;j<W;j++){
          cout << ' ' << map[i][j];
        }
        cout << endl;
      }
    }else cout << "NA" << endl;
  }
}