#include<iostream>
#include<vector>
using namespace std;
typedef struct position{
  int x, y;
}position;
vector<vector<int> > ans2;
bool fit(vector<vector<int> > &ans, position lu, int h, int w, int val){
  for (int i = lu.y; i < lu.y + h; i++) {
    for (int j = lu.x; j < lu.x + w; j++) {
      if(ans[i][j] != 0 and ans[i][j] != val) return false;
    }
  }
  return true;
}
         
bool range(position p, int h, int w, int mh, int mw){
  return ((0 <= p.x and p.x + w - 1 < mw) and
          (0 <= p.y and p.y + h - 1 < mh));
}
           
int dfs(vector<vector<int> > &land,
        vector<vector<int> >  &ans,
         vector<int> &b,
         vector<int> &k,
         vector<position> &s,
         int depth = 0){
  if(depth == b.size()){
    if(ans2[0][0] != -1) return 100;
    ans2 = ans;
    return 1; 
  }
  // std::cout << depth << std::endl;
  int res = 0;
  for (int i = 0; i < k[depth]; i++) {
    int h = 1 + i, w = k[depth]/(i + 1);
    if((k[depth]%(i + 1)) != 0) continue;
    for (int j = 0; j < k[depth]; j++) {
      position lu = s[b[depth]];
      lu.x -= j%w;
      lu.y -= j/w;
      // std::cout << "lu.x:" << lu.x << " lu.y:" << lu.y << std::endl;
      // std::cout << "h:" << h << " w:" << w << std::endl;
      // std::cout << "range:" << range(lu, h, w, land.size(), land[0].size()) << std::endl;
      if(not range(lu, h, w, land.size(), land[0].size())) continue;
      if(fit(ans, lu, h, w, b[depth])) {
        // ansの更新
        for (int k = lu.y; k < lu.y + h; k++) 
          for (int l = lu.x; l < lu.x + w; l++) 
            ans[k][l] = b[depth];

        // for (int i = 0; i < ans.size(); i++) {
        //   for (int j = 0; j < ans[i].size(); j++) {
        //     std::cout << ans[i][j];
        //     if(j != ans[i].size() - 1) std::cout << " ";
        //     else std::cout << std::endl;
        //   }
        // }
        // std::cout << std::endl;

        res += dfs(land, ans, b, k, s, depth + 1);
        // ansを戻す．
        for (int k = lu.y; k < lu.y + h; k++) {
          for (int l = lu.x; l < lu.x + w; l++) {
            ans[k][l] = 0;
            if(k == s[b[depth]].y and l == s[b[depth]].x)ans[k][l] = b[depth];
          }
        }
      }
    }
  }
  return res;
}

int main(){
  int x, y, n;
  ans2.resize(1);
  ans2[0].resize(1, -1);
  while(std::cin >> x >> y >> n){
    if(x == 0) break;
    ans2[0][0] = -1;
    vector<int> b(n), k(n);
    vector<position> s(n + 1, position{-1, -1});
    vector<vector<int> > land(y, vector<int>(x));
    for (int i = 0; i < n; i++) {
      std::cin >> b[i] >> k[i];
    }
    for (int i = 0; i < y; i++) {
      for (int j = 0; j < x; j++) {
        std::cin >> land[i][j];
        if(land[i][j] != 0) s[land[i][j]] = position{j, i};
      }
    }
    vector<vector<int> > ans = land;
    if(dfs(land, ans, b, k, s) == 1){
      for (int i = 0; i < y; i++) {
        for (int j = 0; j < x; j++) {
          std::cout << ans2[i][j];
          if(j != x - 1) std::cout << " ";
          else std::cout << std::endl;
        }
      }
    }else{
      std::cout << "NA" << std::endl;
    }
  }
  return 0;
}

