func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m, cnt, ans;   int a[410][410], c[160010];   int now, f[2][410][410];   void Init() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; ++i)       for (int j = 1; j <= m; ++j) scanf( %d , &a[i][j]);   }   inline void insert(int x) {     if (c[x]) ++cnt;     ++c[x];   }   inline void erase(int x) {     --c[x];     if (c[x]) --cnt;   }   void Work() {     int p;     for (int i = 1; i <= n; ++i) {       p = 1;       for (int j = 1; j <= m; ++j) {         insert(a[i][j]);         while (cnt) {           f[0][i][p] = j - 1;           erase(a[i][p]);           ++p;         }       }       while (p <= m) {         f[0][i][p] = m;         erase(a[i][p]);         ++p;       }       for (int j = 1; j <= m; ++j) ans = max(ans, f[0][i][j] - j + 1);     }   }   void Solve() {     int p;     for (int s = 2; s <= n; ++s) {       now ^= 1;       for (int i = 1; i <= n - s + 1; ++i) {         int j = i + s - 1;         for (int k = 1; k <= m; ++k)           f[now][i][k] = min(f[now ^ 1][i][k], f[now ^ 1][i + 1][k]);         p = 1;         for (int k = 1; k <= m; ++k) {           insert(a[i][k]);           insert(a[j][k]);           while (cnt) {             f[now][i][p] = min(f[now][i][p], k - 1);             erase(a[i][p]);             erase(a[j][p]);             ++p;           }         }         while (p <= m) {           f[now][i][p] = min(f[now][i][p], m);           erase(a[i][p]);           erase(a[j][p]);           ++p;         }         for (int k = 1; k <= m; ++k) ans = max(ans, s * (f[now][i][k] - k + 1));       }     }     printf( %d n , ans);   }   int main() {     Init();     Work();     Solve();     return 0;   }   