/*
#include <stdio.h>
int boxc[1001][1001]={}, box[1002][1002]={};
// BFS
// Queue:
// int loc[100000][2] = {0}
// int rear, front;
//
void check(int a, int b)
{
if(boxc[a+1][b]!=2 && boxc[a+1][b]!=-1){
boxc[a+1][b]=1;
}
if(boxc[a-1][b]!=2 && boxc[a-1][b]!=-1){
boxc[a-1][b]=1;
}
if(boxc[a][b+1]!=2 && boxc[a][b+1]!=-1){
boxc[a][b+1]=1;
}
if(boxc[a][b-1]!=2 && boxc[a][b-1]!=-1){
boxc[a][b-1]=1;
}
return ;
}
int main(void)
{
int m, n, i, j, isdayplus=0, days=0;
scanf("%d %d", &m, &n);
for(i=0; i<=(m+1); i++){
for(j=0; j<=(n+1); j++){
box[i][j]=2;
boxc[i][j]=2;
}
}
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
scanf("%d", &box[i][j]);
boxc[i][j] = box[i][j];
}
}
while(1){
isdayplus=0;
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
if(box[i][j] == 1){
check(i, j);
}
}
}
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
if(box[i][j]!=boxc[i][j]){
isdayplus=1;
}
box[i][j]=boxc[i][j];
}
}
if(isdayplus==1){
days++;
}else{
break;
}
}
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
if(box[i][j]==0){
days = -1;
}
}
}
printf("%d", days);
return 0;
}
*/
/*
#include <stdio.h>
int box[1002][1002]={}, loc[1000000][2]={}, front=0, rear=0, days=0;
void tomato(void)
{
int a, b;
int checkpoint;
checkpoint = rear;
for(; front<checkpoint; front++){
a=loc[front][0];
b=loc[front][1];
if(box[a+1][b]==0){
loc[rear][0]=a+1;
loc[rear][1]=b;
box[a+1][b]=1;
rear++;
}
if(box[a-1][b]==0){
loc[rear][0]=a-1;
loc[rear][1]=b;
box[a-1][b]=1;
rear++;
}
if(box[a][b+1]==0){
loc[rear][0]=a;
loc[rear][1]=b+1;
box[a][b+1]=1;
rear++;
}
if(box[a][b-1]==0){
loc[rear][0]=a;
loc[rear][1]=b-1;
box[a][b-1]=1;
rear++;
}
}
}
int main(void)
{
int m, n, i, j;
scanf("%d %d", &m, &n);
for(i=0; i<=(n+1); i++){
for(j=0; j<=(m+1); j++){
box[i][j]=-1;
}
}
for(i=1; i<=n; i++){
for(j=1; j<=m; j++){
scanf("%d", &box[i][j]);
if(box[i][j]==1){
loc[rear][0]=i;
loc[rear][1]=j;
rear++;
}
}
}
while(front != rear){
tomato();
days++;
}
for(i=1; i<=n; i++){
for(j=1; j<=m; j++){
if(box[i][j]==0){
days=0;
}
}
}
printf("%d", days-1);
return 0;
}
*/
#include <stdio.h>
int num=0, tiles[101]={}, map[102][102]={};
void find(int a, int b)
{
tiles[num]++;
if(map[a+1][b]==0){
find(a+1, b);
}
if(map[a-1][b]==0){
find(a-1, b);
}
if(map[a][b+1]==0){
find(a, b+1);
}
if(map[a][b-1]==0){
find(a, b-1);
}
}
int main(void)
{
int i, j, p, q, m, n, k, a, b, c, d, max=0, temp;
scanf("%d %d %d", &m, &n, &k);
for(p=0; p<=(n+1); p++){
for(q=0; q<=(m+1); q++){
map[p][q]=-1;
}
}
for(p=1; p<=n; p++){
for(q=1; q<=m; q++){
map[p][q]=0;
}
}
for(i=0; i<k; i++){
scanf("%d %d %d %d", &a, &b, &c, &d);
for(p=(a+1); p<=c; p++){
for(q=(b+1); q<=d; q++){
map[p][q]=1;
}
}
}
for(p=1; p<=n; p++){
for(q=1; q<=m; q++){
printf("%d ", map[p][q]);
}
printf("\n");
}
for(p=1; p<=n; p++){
for(q=1; q<=m; q++){
if(map[p][q]==0){
num++;
find(p, q);
}
}
}
for(i=1; i<=n; i++){
max=i;
for(j=1; j<=(n-i); j++){
if(tiles[max]<tiles[j]){
max=j;
}
}
temp=tiles[max];
tiles[max]=tiles[i];
tiles[i]=temp;
}
printf("%d\n", num);
for(i=1; i<=num; i++){
printf("%d ", tiles[i]);
}
return 0;
}