/*
#include<stdio.h>
#include<string.h>
int stackNum[205] = { 0 };
char stackOp[205] = { 0 };
int topNum = 0;
int topOp = 0;
int main() {
char scan[205] = { 0 };
int s = 0;
gets(scan);
for (int i = 0; i < strlen(scan); i++) {
if (scan[i] >= '0' && scan[i] <= '9') {
s = 0;
for (int j = i; ; j++) {
if (scan[j] == ' ') {
stackNum[topNum++] = s;
i = j;
break;
}
s = s * 10;
s = s + (scan[j] - '0');
}
//stackNum[topNum] = scan[i]-48;
//topNum++;
}
else if (scan[i]=='*'){
stackOp[topOp] = '*';
stackNum[topNum - 2] = stackNum[topNum - 2] * stackNum[topNum - 1];
stackNum[topNum - 1] = 0;
topNum--;
}
else if (scan[i] == '+') {
stackOp[topOp] = '+';
stackNum[topNum - 2] = stackNum[topNum - 2] + stackNum[topNum - 1];
stackNum[topNum - 1] = 0;
topNum--;
}
else if (scan[i] == '/') {
stackOp[topOp] = '/';
stackNum[topNum - 2] = stackNum[topNum - 2] / stackNum[topNum - 1];
stackNum[topNum - 1] = 0;
topNum--;
}
else if (scan[i] == '-') {
stackOp[topOp] = '-';
stackNum[topNum - 2] = stackNum[topNum - 2] - stackNum[topNum - 1];
stackNum[topNum - 1] = 0;
topNum--;
}
}
printf("%d", stackNum[0]);
return 0;
}*/
/*
#include<stdio.h>
#include<string.h>
int stack_a[105] = { 0 };
int stack_b[105] = { 0 };
int stack_c[105] = { 0 };
int top_a = 0;
int top_b = 0;
int top_c = 0;
int main() {
char a[105] = { 0 };
char b[105] = { 0 };
scanf_s("%s", a, 105);
top_a = strlen(a);
for (int i = 0; i < strlen(a); i++) {
stack_a[i] = a[i] - 48;
}
scanf_s("%s", b, 105);
top_b = strlen(b);
for (int i = 0; i < strlen(b); i++) {
stack_b[i] = b[i] - 48;
}
top_c = top_a;
int d = top_c;
for(int i = top_c;i>=0;i--){
top_a--;
top_b--;
if (stack_a[top_a] - stack_b[top_b] < 0) {
printf("%d\n", ((stack_a[top_a]) + 10) - stack_b[top_b]);
stack_c[i] = ((stack_a[top_a]) + 10) - stack_b[top_b];
stack_a[top_a - 1] -= 1;
printf("%d\n", stack_c[i]);
}
else {
stack_c[i] = stack_a[top_a] - stack_b[top_b];
}
}
for (int i = 0; i < d; i++) {
printf("%d", stack_c[i]);
}
return 0;
}*/
//BFS DFS
//DFS Depth 깊이우선탐색
//BFS Bandwidth 넓이우선탐색
/*
#include<stdio.h>
int a[30][30] = { 0 };
int count = 0;
int h[100] = { 0 };
void f(int i, int j) {
if (a[i + 1][j] == 1) {
a[i + 1][j] = 0;
h[count]++;
f(i + 1, j);
}
if (a[i - 1][j] == 1) {
a[i - 1][j] = 0;
h[count]++;
f(i - 1, j);
}
if (a[i][j + 1] == 1) {
a[i][j + 1] = 0;
h[count]++;
f(i, j + 1);
}
if (a[i][j - 1] == 1) {
a[i][j - 1] = 0;
h[count]++;
f(i, j - 1);
}
}
int main() {
int n;
scanf_s("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf_s("%1d", &a[i][j]);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i][j] == 1) {
count++;
a[i][j] = 0;
f(i, j);
}
}
}
printf("%d\n", count);
int temp;
for (int i = 1; i <= count; i++) {
for (int j = 1; j < count; j++) {
if (h[j] > h[j + 1]) {
temp = h[j];
h[j] = h[j + 1];
h[j + 1] = temp;
}
}
}
for (int i = 1; i <= count; i++) {
printf("%d\n", h[i]+1);
}
return 0;
}*/
#include<stdio.h>
int sq[105][105] = { 0 };
int m, n, k;
int a, b, c, d;
int count = 0;
int h[100] = { 0 };
void f(int i, int j) {
if (sq[i + 1][j] == 0) {
sq[i + 1][j]++;
h[count]++;
f(i + 1, j);
}
if (sq[i - 1][j] == 0) {
sq[i - 1][j]++;
h[count]++;
f(i - 1, j);
}
if (sq[i][j + 1] == 0) {
sq[i][j + 1]++;
h[count]++;
f(i, j + 1);
}
if (sq[i][j - 1] == 0) {
sq[i][j - 1]++;
h[count]++;
f(i, j - 1);
}
}
int main() {
scanf_s("%d %d %d", &m, &n, &k);
for (int i = 0; i <= m+1; i++) {
for (int j = 0; j <= n+1; j++) {
if(i==0 || j==0 || i==m+1 || j==n+1)
sq[i][j] = 1;
}
}
for (int i = 0; i < k; i++) {
scanf_s("%d %d %d %d", &a, &b, &c, &d);
for (int i = b+1; i <= d; i++) {
for (int j = a+1; j <= c; j++) {
sq[i][j] = 1;
}
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (sq[i][j] == 0) {
count++;
sq[i][j] = 5;
f(i, j);
}
}
}
printf("%d\n", count);
int temp;
for (int i = 1; i <= count; i++) {
for (int j = 1; j < count; j++) {
if (h[j] > h[j + 1]) {
temp = h[j];
h[j] = h[j + 1];
h[j + 1] = temp;
}
}
}
for (int i = 1; i <= count; i++) {
if (h[i] == 100) {
h[i] = 0;
}
printf("%d ", h[i]+1);
}
return 0;
}