Cod sursa(job #2678035)

Utilizator LuxinMatMatasaru Luxin Gabriel LuxinMat Data 27 noiembrie 2020 23:26:28
Problema Matrice 2 Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
struct ura
{
    int x;
    int y;
    int nr;
};
bool cmp(ura a, ura b)
{
    return a.nr > b.nr;
}
ura sef[90001], v[90001];
int m[301][301], n;
ura sefsuprem(ura a)
{
    if(sef[n*(a.x-1)+a.y].x == a.x && sef[n*(a.x-1)+a.y].y == a.y)
        return a;
    else
        return sef[n*(a.x-1)+a.y]=sefsuprem(sef[n*(a.x-1)+a.y]);
}
void unire(ura a, ura b)
{
    ura sef1=sefsuprem(a);
    ura sef2=sefsuprem(b);
    sef[(sef2.x-1)*n+sef2.y]=sef1;
}
int main()
{
    int q, pp=0, a, b, val;
    ura l, c, sef1, sef2;
    cin>>n>>q;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            cin>>val;
            v[(i-1)*n+j].nr=val;
            v[(i-1)*n+j].x=i;
            v[(i-1)*n+j].y=j;
            m[i][j]=val;
        }
    }
    sort(v+1, v+n*n+1, cmp);
    for(int k=1; k<=q; k++)
    {
        pp=0;
        cin>>l.x>>l.y>>c.x>>c.y;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                sef[n*(i-1)+j]={i, j};
        for(int i=1; i<=n*n && pp==0; i++)
        {
            a=v[i].x;
            b=v[i].y;
            if(v[i].nr <= m[a+1][b])
            {
                ura z={a+1, b, m[a+1][b]};
                unire(v[i], z);
            }
            if(v[i].nr <= m[a][b+1])
            {
                ura z={a, b+1, m[a][b+1]};
                unire(v[i], z);
            }
            if(v[i].nr <= m[a-1][b])
            {
                ura z={a-1, b, m[a-1][b]};
                unire(v[i], z);
            }
            if(v[i].nr <= m[a][b-1])
            {
                ura z={a, b-1, m[a][b-1]};
                unire(v[i], z);
            }
            sef1=sefsuprem(l);
            sef2=sefsuprem(c);
            if(sef1.x == sef2.x && sef1.y == sef2.y)
            {
                pp=1;
                cout<<v[i].nr<<'\n';
            }
        }
    }
    return 0;
}