func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1605;   int n, m, tot;   int a[MAXN][MAXN];   int sz[MAXN * MAXN];   int ans[MAXN * MAXN];   int cnt[MAXN * MAXN];   int fa1[MAXN * MAXN];   int fa2[MAXN * MAXN];   double v[MAXN][MAXN];   double t[MAXN][MAXN];   int getroot(int *fa, int u) {     return u == fa[u] ? u : fa[u] = getroot(fa, fa[u]);   }   void run() {     memcpy(t, v, sizeof(t));     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (a[i][j]) {           double sum = 0, cnt = 0;           for (int k = i - 4; k <= i + 4; k++)             for (int l = j - 4; l <= j + 4; l++)               if (k >= 1 && k <= n && l >= 1 && l <= m &&                   (i - k) * (i - k) + (j - l) * (j - l) <= 25)                 sum += t[k][l], cnt++;           v[i][j] = sum / cnt;         }   }   void merge(int *fa, int xa, int ya, int xb, int yb) {     if (!a[xa][ya] || !a[xb][yb]) return;     fa[getroot(fa, (xa - 1) * m + ya)] = getroot(fa, (xb - 1) * m + yb);   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         fa1[(i - 1) * m + j] = fa2[(i - 1) * m + j] = (i - 1) * m + j;     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++) scanf( %d , &a[i][j]);     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (a[i][j]) {           v[i][j] = 1;           if (i > 1) merge(fa1, i, j, i - 1, j);           if (i < n) merge(fa1, i, j, i + 1, j);           if (j > 1) merge(fa1, i, j, i, j - 1);           if (j < m) merge(fa1, i, j, i, j + 1);         }     run();     run();     run();     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (a[i][j] && v[i][j] < 0.2) {           if (i > 1 && v[i - 1][j] < 0.2) merge(fa2, i, j, i - 1, j);           if (i < n && v[i + 1][j] < 0.2) merge(fa2, i, j, i + 1, j);           if (j > 1 && v[i][j - 1] < 0.2) merge(fa2, i, j, i, j - 1);           if (j < m && v[i][j + 1] < 0.2) merge(fa2, i, j, i, j + 1);         }     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (a[i][j] && v[i][j] < 0.2) sz[getroot(fa2, (i - 1) * m + j)]++;     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (a[i][j] && v[i][j] < 0.2 &&             getroot(fa2, (i - 1) * m + j) == (i - 1) * m + j &&             sz[(i - 1) * m + j] >= 5)           cnt[getroot(fa1, (i - 1) * m + j)]++;     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (a[i][j] && getroot(fa1, (i - 1) * m + j) == (i - 1) * m + j)           ans[++tot] = cnt[(i - 1) * m + j];     sort(ans + 1, ans + tot + 1);     printf( %d n , tot);     for (int i = 1; i <= tot; i++) printf( %d  , ans[i]);     printf(  n );     return 0;   }   