#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define all(n) n.begin(),n.end()
struct P{
	int x,y;
	P(int a,int b){x=a,y=b;}
};

int compress(vector<int> &org,int length,vector<int> &one,vector<int> &two){
	sort(all(org));
	org.erase(unique(all(org)),org.end());
	int cur = 0;
	for(int i=(org[0]==0?1:0);i<org.size();i++){ //org[0]ª0¾Á½çíé(»êÍ±Üé)B
		if(org[i] == cur+1) cur += 1; //×ÚµÄ½ç1Â¾¯¸ç·B
		else cur += 2;	//×ÚµÄÈ¢ñ¾Á½ç2Â(1ÂÔªó­æ¤Éæéæ)
		rep(j,one.size()){
			if(one[j] == org[i]) one[j] = cur;
			if(two[j] == org[i]) two[j] = cur;
		}
	}
	return cur + (org.back()!=length); // org.back() !- length¾Á½êóÔÉÜ¾]Tª éÌÅTCYÍlength = cur+1Æ·éB
}

bool board[3000][3000];
void dfs(bool Map[3000][3000],P start,int W,int H){
	static const int dx[] = {0,0,-1,1} , dy[] = {1,-1,0,0};
	
	stack<P> S;
	S.push(start);
	while(S.size()){
		P s = S.top(); S.pop();
		rep(i,4){
			P t = P(s.x+dx[i],s.y+dy[i]);
			if(t.y >= 0 && t.x >= 0 && t.y < H && t.x < W && Map[t.y][t.x] == 0){
				Map[t.y][t.x] = true;
				S.push(t);
			}
		}
	}
}


int main(){
	int W,H;
	while(cin >> W >> H , W){
		vector<int> ox,oy,sx,ex,sy,ey;
		int n; cin >> n;
		rep(i,n){
			int x1,y1,x2,y2;
			cin >> x1 >> y1 >> x2 >> y2;			
			sx.push_back(x1),sy.push_back(y1); //s? = ¶º (ÀW³k³êéû1)
			ex.push_back(x2),ey.push_back(y2); //e? = Eã (ÀW³k³êéû2)
			
			ox.push_back(x1),oy.push_back(y1); //o? = s?àe?àÇÁ¿àÂÁ±ÞB(ÀW³kÌÚóÉg¤)
			ox.push_back(x2),oy.push_back(y2); //
		}
		// ³k compress(...)ÌÔèlÍ³kãÌÕÊTCYB
		W = compress(ox,W,sx,ex);
		H = compress(oy,H,sy,ey);
		
		
		rep(i,H)rep(j,W)board[i][j] = false; // ú»
		
		//³kãÌ¶ºÆEãÀWðgÁÄÕÊðhèÂÔ·B
		rep(i,n){
			for(int x = sx[i] ; x < ex[i] ; x++){
				for(int y = sy[i] ; y < ey[i] ; y++){
					board[y][x] = true;
				}
			}
		}
		//hèÂÔµÈªç¦é´¶BÀÛÉhèÂÔ·ÌÍdfs()ÖB
		int ans = 0;
		rep(y,H){
			rep(x,W){
				if(board[y][x] == false){
					ans++;
					dfs(board,P(x,y),W,H);
				}
			}
		}
		
		cout << ans << endl;
	}
}