#pragma GCC optimize "O3"
#pragma GCC target "sse4.1"

#include <iostream>

int n, m, q;

bool used[1000 + 10][1000 + 10];

int sq(int sx, int sy) {
#define D {fail = true; break; }

	for(int s = 0;;s ++) {
		bool fail = false;
		if(sx + s >= m+2 or sy + s >= n+2) while(true) {};
		for(int x = sx;x <= sx + s;x ++) {
			if(used[x][sy + 0]) D;
			if(used[x][sy + s]) D;
		}
		if(fail) return s;
		for(int y = sy;y <= sy + s;y ++) {
			if(used[sx + 0][sy]) D;
			if(used[sx + s][sy]) D;
		}
		if(fail) return s;
	}
}

int main() {
	std::cin.tie(nullptr);
	//std::ios_base::sync_wth_stdio(false);

	std::cin >> n >> m;
	std::cin >> q;

	for(int i = 0;i < q;i ++) {
		int x1, y1, x2, y2;
		std::cin >> y1 >> x1 >> y2 >> x2;
		//x1 --;
		//y1 --;
		//x2 --;
		//y2 --;
		for(int x = x1;x <= x2;x ++) {
			for(int y = y1;y <= y2;y ++) {
				used[x][y] = true;
			}
		}
	}
	for(int sx = 0;sx <= m+1;sx ++) {
		for(int sy = 0;sy <= n+1;sy ++) {
			if(sx == 0 or sx == m+1 or sy == 0 or sy == n+1) used[sx][sy] = true;
			//std::cout << used[sx][sy];
		}
		//std::cout << '\n';
	}

	int ans = 0;
	bool any = true;
	for(int sx = 1;sx <= m;sx ++) {
		for(int sy = 1;sy <= n;sy ++) {
			if(used[sx][sy]) continue;
			any = true;
			const int s = sq(sx, sy);
			if(s >= ans) {
				//std::cout << s << ' ' << sx << ' ' << sx << std::endl;
				ans = s;
			}
		}
	}
	if(any and ans == 0) ans = 1;

	std::cout << ans << std::endl;
	return 0;
}
