Cod sursa(job #2840596)

Utilizator marcumihaiMarcu Mihai marcumihai Data 28 ianuarie 2022 11:00:31
Problema Matrice 2 Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("matrice2.in");
ofstream g ("matrice2.out");

int n,m;
int mt[505][505];
int q;
int a[505][505];
queue <pair <int, int >> Q;
int di[4]= {0, 0, 1, -1};
int dj[4]= {1, -1, 0, 0};

int ok1(int i, int j, int val)
{
    if(i<1 || j<1 || i>n || j>n)
        return 0;
    if(a[i][j]!=0)
        return 0;
    if(mt[i][j]<val)
        return 0;
    return 1;
}



int ok(int val,int istart, int jstart,int  ifin,int  jfin)
{
    if(mt[istart][jstart]>=val)
    {
        Q.push({istart, jstart});
        a[istart][jstart]=1;
        while(!Q.empty())
        {

            int i=Q.front().first;
            int j=Q.front().second;
            ///cout<<val<<" "<<i<<" "<<j<<" "<<mt[i][j]<<"\n";
            if(i==ifin && j==jfin)
            {
                for(int i=1; i<=n; ++i)
                    for(int j=1; j<=n; ++j)
                        a[i][j]=0;
                while(!Q.empty())
                    Q.pop();
                return 1;
            }

            for(int x=0; x<4; ++x)
            {
                if(ok1(i+di[x], j+dj[x], val))
                {
                    a[i+di[x]][j+dj[x]]=1;
                    Q.push({i+di[x], j+dj[x]});
                }
            }

            Q.pop();
        }
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
                a[i][j]=0;
        while(!Q.empty())
            Q.pop();
        return 0;



    }
    else
        return 0;
}



int main()
{
    f>>n>>q;
    int maxim=0;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=n; ++j)
        {
            f>>mt[i][j];
            maxim=max(maxim, mt[i][j]);
        }
    }

    for(int query=1; query<=q; ++query)
    {
        int iprim, jprim;
        int isecund, jsecund;
        f>>iprim>>jprim>>isecund>>jsecund;
        int st=1;
        int dr=maxim;
        int mij=(st+dr)/2;
        int rez=0;
        while(st<=dr)
        {
            if(ok(mij, iprim, jprim, isecund, jsecund))
            {
                rez=mij;
                st=mij+1;
            }
            else
                dr=mij-1;
            mij=(st+dr)/2;
        }
        g<<rez<<"\n";
    }



    return 0;
}