1+ import java .io .BufferedReader ;
2+ import java .io .IOException ;
3+ import java .io .InputStreamReader ;
4+ import java .util .*;
5+
6+ public class Main {
7+
8+ private static int N , M , K ;
9+ private static int [] dx = {0 , 0 , 1 , -1 };
10+ private static int [] dy = {1 , -1 , 0 , 0 };
11+ private static boolean [][] visited ;
12+ private static int [][] arr ;
13+
14+ public static void main (String [] args ) throws IOException {
15+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
16+ StringTokenizer st = new StringTokenizer (br .readLine ());
17+
18+ M = Integer .parseInt (st .nextToken ());
19+ N = Integer .parseInt (st .nextToken ());
20+ K = Integer .parseInt (st .nextToken ());
21+
22+ arr = new int [M ][N ];
23+ visited = new boolean [M ][N ];
24+
25+ for (int i = 0 ; i < K ; i ++) {
26+ st = new StringTokenizer (br .readLine ());
27+
28+ int x1 = Integer .parseInt (st .nextToken ());
29+ int y1 = Integer .parseInt (st .nextToken ());
30+ int x2 = Integer .parseInt (st .nextToken ());
31+ int y2 = Integer .parseInt (st .nextToken ());
32+
33+ for (int y = y1 ; y < y2 ; y ++) {
34+ for (int x = x1 ; x < x2 ; x ++) {
35+ arr [y ][x ] = 1 ;
36+ }
37+ }
38+
39+ }
40+
41+ List <Integer > answer = new ArrayList <>();
42+ for (int i = 0 ; i < M ; i ++) {
43+ for (int j = 0 ; j < N ; j ++) {
44+ if (!visited [i ][j ] && arr [i ][j ] == 0 ) {
45+ answer .add (bfs (i , j ));
46+ }
47+ }
48+ }
49+ Collections .sort (answer );
50+
51+ System .out .println (answer .size ());
52+ for (int i : answer ) {
53+ System .out .print (i + " " );
54+ }
55+ br .close ();
56+ }
57+
58+ private static int bfs (int x , int y ) {
59+ Queue <int []> queue = new LinkedList <>();
60+ queue .offer (new int []{x , y });
61+ visited [x ][y ] = true ;
62+
63+ int count = 1 ;
64+ while (!queue .isEmpty ()) {
65+ int [] cur = queue .poll ();
66+
67+ for (int i = 0 ; i < 4 ; i ++) {
68+ int newX = cur [0 ] + dx [i ];
69+ int newY = cur [1 ] + dy [i ];
70+
71+ if (newX < 0 || newY < 0 || newX >= M || newY >= N ) {
72+ continue ;
73+ }
74+
75+ if (visited [newX ][newY ] || arr [newX ][newY ] == 1 ) {
76+ continue ;
77+ }
78+
79+ queue .offer (new int []{newX , newY });
80+ visited [newX ][newY ] = true ;
81+ count ++;
82+ }
83+ }
84+
85+ return count ;
86+ }
87+
88+ }
0 commit comments