// g++ temp.cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <set>
#include <map>
#include <string>
#include <climits>
#include <sstream>
using namespace std;

#define FOR(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define REP(i,n) FOR(i,0,n)
#define EACH(itr,v) for(auto itr:v)
#define pb(s) push_back(s)
#define mp(a,b) make_pair(a,b)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<P, int> PPI;

#define INF INT_MAX/3

#define MAX_N 1000

namespace patch
{
    template < typename T > std::string to_string( const T& n )
	{
		std::ostringstream stm ;
		stm << n ;
		return stm.str() ;
	}
}

int W,H,N;
int X1[1000],X2[1000],Y1[1000],Y2[1000];

bool fld[1000*6][1000*6];

const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};

int compress(int *x1,int *x2, int w){
	vector<int> xs;

	REP(i,N){
		for(int d=-1;d<=1;d++){
			int tx1=x1[i]+d, tx2=x2[i]+d;
			if(0<=tx1&&tx1<w) xs.push_back(tx1);
			if(0<=tx2&&tx2<w) xs.push_back(tx2);
		}
	}
	sort(all(xs));
	xs.erase(unique(xs.begin(),xs.end()),xs.end());

	REP(i,N){
		x1[i]=find(all(xs),x1[i])-xs.begin();
		x2[i]=find(all(xs),x2[i])-xs.begin();
	}
	return xs.size();
}

int main(){
	cin.sync_with_stdio(false);
	while(1){
		cin>>W>>H;
		if(W==0&&H==0) break;
		cin>>N;
		REP(i,N)cin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i];
		W=compress(X1,X2,W);
		H=compress(Y1,Y2,H);
		memset(fld,0,sizeof(fld));
		REP(i,N){
			for(int y=Y1[i];y<Y2[i];y++){
				for(int x=X1[i];x<X2[i];x++){
					fld[y][x]=true;
				}
			}
		}
		//cout<<endl;
		//REP(y,H)REP(x,W) printf("%d%c", fld[y][x],(x==W-1?'\n':' '));

		int ans=0;
		REP(y,H)REP(x,W){
			if(fld[y][x]) continue;
			ans++;

			queue<P> que;
			que.push(mp(x,y));
			while(!que.empty()){
				int sx=que.front().first, sy=que.front().second;
				que.pop();
				REP(i,4){
					int tx=sx+dx[i], ty=sy+dy[i];
					if(tx<0||W<=tx||ty<0||H<=ty) continue;
					if(fld[ty][tx]) continue;
					que.push(mp(tx,ty));
					fld[ty][tx]=true;
				}
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}