Cod sursa(job #2812885)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 5 decembrie 2021 13:11:49
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

ifstream fin ("matrice2.in");
ofstream fout ("matrice2.out");

int a[302][302];

struct el
{
    int l, c, val;
} s[90001];

bool comp (const el &a, const el &b)
{
    return a.val > b.val;
}

int t[90001], h[90001];

int cauta (int x);
void uneste (int x, int y);

struct idk
{
    int l1, c1, l2, c2;
    int rasp;
} intr[20001];

vector <int> prag[301];
bool fol[20001];

int main()
{
    int n, q, i, j, la, ca, lv, cv, x, y;
    int dl[4] = {-1, 0, 1, 0};
    int dc[4] = {0, 1, 0, -1};

    fin >> n >> q;
    for (i = 1; i<=n; i++)
        for (j = 1; j<=n; j++)
        {
            fin >> a[i][j];
            s[(i-1)*n+j] = {i, j, a[i][j]};
        }

    for (i = 1; i<=q; i++)
        fin >> intr[i].l1 >> intr[i].c1 >> intr[i].l2 >> intr[i].c2;

    sort (s+1, s+n*n+1, comp);
    for (i = 1; i<=n*n; i++)
    {
        la = s[i].l;
        ca = s[i].c;
        for (j = 0; j<4; j++)
        {
            lv = la + dl[j];
            cv = ca + dc[j];

            if (lv >= 1 && lv <= n && cv >= 1 && cv <= n && a[lv][cv] >= s[i].val)
            {
                x = cauta ((la-1)*n+ca);
                y = cauta ((lv-1)*n+cv);

                if (x != y)
                    uneste (x, y);
            }
        }

        if (i % n == 0)
        {
            for (j = 1; j<=q; j++)
                if (fol[j] == 0 && cauta ((intr[j].l1-1)*n + intr[j].c1) == cauta ((intr[j].l2-1)*n + intr[j].c2))
                {
                    cout << s[i].val << ' ' << j << endl;
                    prag[i/n-1].push_back (j);
                    fol[j] = 1;
                }
        }
    }

    for (i = 1; i<=n*n; i++)
        t[i] = h[i] = 0;
    for (i = 1; i<=q; i++)
        fol[i] = 0;

    for (i = 1; i<=n*n; i++)
    {
        la = s[i].l;
        ca = s[i].c;
        for (j = 0; j<4; j++)
        {
            lv = la + dl[j];
            cv = ca + dc[j];

            if (lv >= 1 && lv <= n && cv >= 1 && cv <= n && a[lv][cv] >= s[i].val)
            {
                x = cauta ((la-1)*n+ca);
                y = cauta ((lv-1)*n+cv);

                if (x != y)
                    uneste (x, y);
            }
        }

        x = i/n - (i%n == 0);
        for (j = 0; j<prag[x].size(); j++)
        {
            y = prag[x][j];
            if (fol[y] == 0 && cauta ((intr[y].l1-1)*n + intr[y].c1) == cauta ((intr[y].l2-1)*n + intr[y].c2))
            {
                intr[y].rasp = s[i].val;
                fol[y] = 1;
            }
        }
    }

    for (i = 1; i<=q; i++)
        fout << intr[i].rasp << '\n';
    return 0;
}

int cauta (int x)
{
    int r = x, y;
    while (t[r])
        r = t[r];

    while (x != r)
    {
        y = t[x];
        t[x] = r;
        x = y;
    }
    return r;
}

void uneste (int x, int y)
{
    if (h[x] < h[y])
        t[x] = y;
    else
    {
        t[y] = x;
        if (h[x] == h[y])
            h[x]++;
    }
}