#include <bits/stdc++.h>
using namespace std;
 
vector<int> graf[1000007];
bool odwiedzony[1000007];
int warstwa[1000007];
 
int main() {
	int n, m, S, a, b;
	cin >> n >> m;
	for(int i = 1; i <=n*m; i++){
		int opcja1 = i-1;
		int opcja2 = i+1;
		int opcja3 = i-m;
		int opcja4 = i+m;
		if(opcja1 >= 1 && opcja1 <= n*m){
			graf[i].push_back(opcja1);
		}
		if(opcja2 >= 1 && opcja2 <= n*m){
			graf[i].push_back(opcja2);
		}
		if(opcja2 >= 1 && opcja1 <= n*m){
			graf[i].push_back(opcja2);
		}
		if(opcja3 >= 1 && opcja3 <= n*m){
			graf[i].push_back(opcja3);
		}
		if(opcja4 >= 1 && opcja4 <= n*m){
			graf[i].push_back(opcja4);
		}
	}
	cin >> S;
	queue<int> Q;
	for(int i = 0; i < S; i++){
		cin >> a >> b;
		//wrzuæ do kolejki
		Q.push((a*m)-(m-b));
		odwiedzony[(a*m)-(m-b)] = true;
	}
	//BFS
	while (not(Q.empty())) {
		int v = Q.front();
		Q.pop();
		for (int sasiad : graf[v]) {
    		if (not(odwiedzony[sasiad])) {
    			odwiedzony[sasiad] = true;
    			Q.push(sasiad);
    			warstwa[sasiad] = warstwa[v] + 1;
    		}
		}
	}
	for(int i = 1; i <= n*m; i++){
		cout << warstwa[i] << " ";
		if(i % m == 0){
			cout << "\n";
		}
	}
	return 0;
}