Cod sursa(job #2391750)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 29 martie 2019 10:30:30
Problema Matrice 2 Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int n, q;
vector<int>v[100002];
int a[302][302], nr[302][302], cod;
int ans[50002];
bool pus[302][302];
int tt[100002], rg[100002];
int val; // current value
int Find(int a)
{
    if(tt[a] == a)
        return a;
    return tt[a] = Find(tt[a]);
}
void Union(int a, int b)
{
    vector<int>z;
    for(int j = 0; j < v[a].size(); ++j)
        z.push_back(v[a][j]);
    for(int j = 0; j < v[b].size(); ++j)
        z.push_back(v[b][j]);
    sort(z.begin(), z.end());
    v[a].clear();
    v[b].clear();
    if(rg[a] > rg[b])
    {
        tt[b] = a, rg[a] += rg[b];
        for(int i = 0; i < z.size(); ++i)
        {
            if(i+1 < z.size() && z[i] == z[i+1])
                ans[z[i]] = val, ++i;
            else
                v[a].push_back(z[i]);
        }
    }
    else
    {
        tt[a] = b, rg[b] += rg[a];
        for(int i = 0; i < z.size(); ++i)
        {
            if(i+1 < z.size() && z[i] == z[i+1])
                ans[z[i]] = val, ++i;
            else
                v[b].push_back(z[i]);
        }
    }
}
struct no
{
    int L, C, val;
};
no zz[100002];
bool cmp(no a, no b)
{
    return a.val < b.val;
}
int ox[] = {-1, 0, 1, 0};
int oy[] = {0, 1, 0, -1};
int main()
{
    f >> n >> q;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
        {
            f >> a[i][j];
            ++cod;
            nr[i][j] = cod;
            zz[cod] = {i, j, a[i][j]};
        }
    sort(zz + 1, zz + cod + 1, cmp);
    for(int i = 1; i <= cod; ++i)
        tt[i] = i, rg[i] = 1;
    for(int i = 1; i <= q; ++i)
    {
        int a, b, c, d;
        f >> a >> b >> c >> d;
        v[nr[a][b]].push_back(i);
        v[nr[c][d]].push_back(i);
    }
    for(int i = cod; i >= 1; --i)
    {
        val = zz[i].val;
        pus[zz[i].L][zz[i].C] = 1;
        for(int j = 0; j <= 3; ++j)
        {
            int Lvecin = zz[i].L + ox[j];
            int Cvecin = zz[i].C + oy[j];
            if(pus[Lvecin][Cvecin] && Find(nr[zz[i].L][zz[i].C]) != Find(nr[Lvecin][Cvecin]))
                Union(Find(nr[zz[i].L][zz[i].C]), Find(nr[Lvecin][Cvecin]));
        }
    }
    for(int i = 1; i <= q; ++i)
        g << ans[i] << '\n';
    return 0;
}