Cod sursa(job #3200873)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 5 februarie 2024 22:37:03
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
#include <vector>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
const int NMAX=305;
const int QMAX=20005;
const int VMAX=1e6+5;

using namespace std;
ifstream fin("matrice.in");
ofstream fout("matrice.out");

int t[NMAX*NMAX], mn[NMAX*NMAX];
int dl[]={0, 0, -1, 1};
int dc[]={-1, 1, 0, 0};
int a[NMAX][NMAX], n, q, sol[QMAX];
map<pair<int, int>, int> f;
unordered_map<int, vector<pair<int, int>>> comp;
unordered_map<int, unordered_set<int>> cmp;
vector <pair<int, int>> v;
pair<int, int> to_cell[NMAX*NMAX];


int to_node(int, int);
void unite(int, int, int);
int find(int);

int main()
{
    int i, j, k, maxim=0;
    fin>>n>>q;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            to_cell[to_node(i, j)]={i, j};
            fin>>a[i][j];
            t[to_node(i, j)]=to_node(i, j);
            maxim=max(maxim, a[i][j]);
            v.push_back({a[i][j], to_node(i, j)});
        }
    }
    sort(v.begin(), v.end(), greater<pair<int, int>>());
    int aa, b, c, d;
    for(i=1; i<=q; i++)
    {
        fin>>aa>>b>>c>>d;
        comp[to_node(aa, b)].push_back({to_node(c, d), i});
        cmp[to_node(aa, b)].insert(i);
        comp[to_node(c, d)].push_back({to_node(aa, b), i});
        cmp[to_node(c, d)].insert(i);
    }
    for(auto j:v)
    {
        for(k=0; k<4; k++)
        {
            int l=dl[k]+to_cell[j.second].first;
            int c=dc[k]+to_cell[j.second].second;
            if(to_node(l,c)!=-1 && a[l][c]>=j.first) unite(to_node(l, c), j.second, j.first);
        }
    }
    for(i=1; i<=q; i++) fout<<sol[i]<<'\n';
    return 0;
}

int find(int nod)
{
    if(t[nod]==nod) return nod;
    t[nod]=find(t[nod]);
    return t[nod];
}

void unite(int a, int b, int nr)
{
    //fout<<to_cell[a].first<<' '<<to_cell[a].second<<' '<<to_cell[b].first<<' '<<to_cell[b].second<<'\n';
    a=find(a); b=find(b);
    if(a==b) return;
    if(comp[a].size()<comp[b].size()) swap(a, b);
    t[b]=a;
    for(auto i:comp[b])
    {
        if(cmp[a].find(i.second)!=cmp[a].end())
        {
            sol[i.second]=nr;
            cmp[a].erase(cmp[a].find(i.second));
        }
        else
        {
            comp[a].push_back({find(i.first), i.second});
            cmp[a].insert(i.second);
        }
    }
    comp.erase(b);
    cmp.erase(b);
}

int to_node(int l, int c)
{
    if(l<1 || l>n || c<1 || c>n) return -1;
    return (l-1)*n+c;
}