Cod sursa(job #3328883)

Utilizator fumfummititelu david fumfum Data 10 decembrie 2025 22:20:29
Problema Puteri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#define N 1240
using namespace std;

ifstream gg("ternar2.in");
ofstream wp("ternar2.out");

short int a[N][N],l[N][N],c[N][N], n,m;
short cs, cd, ls, ld;
int s;
short dx[]={0,1,0,-1},dy[]={1,0,-1,0};

void citire(){
    gg>>n>>m;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            {
                gg>>a[i][j];
                if(a[i][j]==1){
                    l[i][j]=b[i][j-1]+1; /// lungimea pe linii
                    c[i][j]=c[i-1][j]+1; /// latimea pe coloane
                }
                else l[i][j]=c[i][j]=0;
            }
}

void fill(short int i, short int j){
    short int x,y,p;
    pair<short, short> st;
    st.push({i,j});
    a[i][j]=0;
    s=1;

    ls=ld=i;
    cs=cd=j;

    while(!st.empty()){
        i=st.top().first;
        j=st.top().second
        st.pop();

        for(int dir=0; dir<4; ++dir){
            x=i+dx[i]; 
            y=j+dy[j]
            if(a[x][y]==2){
                xs=min(xs,x);
                xd=max(xd,x);
                ys=min(ys,y);
                yd=max(yd,y);
                s++;
                a[i][j]=0;
                st.push({x,y});
            }
        }
    }
}

void finish(){
    short i,j,sl,sc;
    int ariemax=0;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            if(a[i][j]==2){
                fill(i,j);
                sl=xd-xs+1;
                sc=yd-ys+1;
                if(s==sc*sl){
                    if (l[xd+1][yd+1] >= sc + 2 && c[xd+1][yd+1] >= sl + 2 && l[xs-1][yd+1] >= sc + 2 && c[xd+1][ys-1] >= sl + 2)
                            ariemax = max(ariemax, (int)(sc + 2)*(sl + 2));
                }
            }
    wp<<ariemax;
}

int main(){
    citire();
    finish();
    return 0;
}