#include <bits/stdc++.h>
using namespace std;
struct pontos {
  int x1, y1, x2, y2;
};
int H, W, n;
int X1, Y1, X2, Y2;
pontos rec, barraInicial;
vector<int> tamanhos;
vector<pontos> barras;
list<pontos> cortes;
void read() {
  scanf("%d %d %d", &H, &W, &n);
  barraInicial.x1 = barraInicial.y1 = 0;
  barraInicial.x2 = H;
  barraInicial.y2 = W;
  barras.push_back(barraInicial);
  for (int cont = 0; cont < n; cont++) {
    scanf("%d %d %d %d", &rec.x1, &rec.y1, &rec.x2, &rec.y2);
    cortes.push_front(rec);
  }
}
bool cortarChocolate(pontos* bar, pontos* cut) {
  bool cortou = ((cut->y1 == bar->y1 && cut->y2 == bar->y2 &&
                  cut->x1 > bar->x1 && cut->x2 < bar->x2) ||
                 (cut->x1 == bar->x1 && cut->x2 == bar->x2 &&
                  cut->y1 > bar->y1 && cut->y2 < bar->y2));
  if (cortou) {
    pontos novaBarra;
    novaBarra.x1 = cut->x1;
    novaBarra.y1 = cut->y1;
    novaBarra.x2 = bar->x2;
    novaBarra.y2 = bar->y2;
    bar->x2 = cut->x2;
    bar->y2 = cut->y2;
    barras.push_back(novaBarra);
  }
  return cortou;
}
void process() {
  bool cortou;
  while (!cortes.empty()) {
    cortou = false;
    pontos corteAux = cortes.front();
    cortes.pop_front();
    for (int cont = 0; cont < barras.size(); cont++) {
      if (cortarChocolate(&barras.at(cont), &corteAux)) {
        cortou = true;
        break;
      }
    }
    if (!cortou) {
      cortes.push_back(corteAux);
    }
  }
  for (int cont = 0; cont < barras.size(); cont++) {
    pontos bar = barras.at(cont);
    tamanhos.push_back((bar.x2 - bar.x1) * (bar.y2 - bar.y1));
  }
  sort(tamanhos.begin(), tamanhos.end());
  for (int cont = 0; cont < tamanhos.size(); cont++) {
    printf("%d ", tamanhos.at(cont));
  }
}
int main() {
  read();
  process();
  return 0;
}
