Cod sursa(job #3185963)

Utilizator AswVwsACamburu Luca AswVwsA Data 20 decembrie 2023 21:58:13
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <iomanip>
#define ll long long
using namespace std;

const int NMAX = 300;
const int QMAX = 20000;

int v[NMAX + 1][NMAX + 1];

int ans[QMAX + 1];
int n;

int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};


set <int> s[NMAX + 1][NMAX + 1];

bool active[NMAX + 1][NMAX + 1];
pair <int, int> ds[NMAX * NMAX + 1];

bool cmp(pair <int, int> a, pair <int, int> b)
{
    return v[a.first][a.second] > v[b.first][b.second];
}

pair <int, int> tata[NMAX + 1][NMAX + 1];


pair <int, int> dad(int a, int b)
{
    if (tata[a][b] == make_pair(a, b))
        return make_pair(a, b);
    tata[a][b] = dad(tata[a][b].first, tata[a][b].second);
    return tata[a][b];
}

void combine(pair <int, int> a, pair <int, int> b)
{
    int val = v[a.first][a.second];
    a = dad(a.first, a.second);
    b = dad(b.first, b.second);
    if (a == b)
        return ;
    pair <int, int> delacine, unde;
    if (s[a.first][a.second].size() > s[b.first][b.second].size())
    {
        delacine = b;
        unde = a;
    }
    else
    {
        delacine = a;
        unde = b;
    }
    tata[delacine.first][delacine.second] = unde;
    for (int x : s[delacine.first][delacine.second])
    {
        if (s[unde.first][unde.second].find(x) != s[unde.first][unde.second].end())
        {
            ans[x] = val;
            s[unde.first][unde.second].erase(x);
        }
        else
            s[unde.first][unde.second].insert(x);
    }
    s[delacine.first][delacine.second].clear();
}

void joint(int a, int b)
{
    int k;
    for (k = 0; k < 4; k++)
    {
        int ni = a + di[k];
        int nj = b + dj[k];
        if (ni >= 1 and ni <= n and nj >= 1 and nj <= n and active[ni][nj])
            combine(make_pair(a, b), make_pair(ni, nj));
    }
}

ifstream cin("matrice2.in");
ofstream cout("matrice2.out");

signed main()
{
    int i, j, q;
    cin >> n >> q;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
        {
            cin >> v[i][j];
            tata[i][j] = {i, j};
            ds[(i - 1) * n + j] = {i, j};
        }
    for (i = 1; i <= q; i++)
    {
        int i1, j1, i2, j2;
        cin >> i1 >> j1 >> i2 >> j2;
        s[i1][j1].insert(i);
        s[i2][j2].insert(i);
    }
    sort(ds + 1, ds + 1 + n * n, cmp);
    for (i = 1; i <= n * n; i++)
    {
        joint(ds[i].first, ds[i].second);
        active[ds[i].first][ds[i].second] = 1;
    }
    for (i = 1; i <= q; i++)
        cout << ans[i] << "\n";
}