Cod sursa(job #3287562)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 18 martie 2025 16:42:46
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
#define nmx 305
#define qmx 20005
using namespace std;
int n,q,v[nmx][nmx],rsp[qmx],ct,sz[nmx*nmx],roo[nmx*nmx];
struct edge
{
    int c,x,y;
};
int cod(int i,int j)
{
    return (i-1)*n+j;
}
set <int> rs[nmx*nmx];
edge m[nmx*nmx*4];
int root(int r)
{
    if (roo[r]==r)
        return r;
    return roo[r]=root(roo[r]);
}
void merg(int x,int y,int cost)
{
    if (sz[x]<sz[y])
        swap(x,y);
    sz[x]+=sz[y];
    sz[y]=0;
    roo[y]=x;
    for (auto it : rs[y])
    {
        if (rs[x].find(it)!=rs[x].end())
        {
            rsp[it]=cost;
            rs[x].erase(it);
        }
        else rs[x].insert(it);
    }
    rs[y].clear();
}
bool cmp(edge a,edge b)
{
    return a.c>b.c;
}
int main()
{
    ifstream f ("matrice2.in");
    ofstream g ("matrice2.out");
    f>>n>>q;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
            f>>v[i][j];
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
        {
            int x=cod(i,j);
            if (i<n)
            {
                int y=cod(i+1,j);
                m[++ct]= {min(v[i][j],v[i+1][j]),x,y};
            }
            if (j<n)
            {
                int y=cod(i,j+1);
                m[++ct]= {min(v[i][j],v[i][j+1]),x,y};
            }
        }
    sort (m+1,m+ct+1,cmp);
    for (int i=1; i<=n*n; i++)
        sz[i]=1,roo[i]=i;
    int a,b,c,d;
    for (int i=1; i<=q; i++)
    {
        f>>a>>b>>c>>d;
        rs[cod(a,b)].insert(i);
        rs[cod(c,d)].insert(i);
    }
    for (int i=1; i<=ct; i++)
    {
        int xs=root(m[i].x);
        int ys=root(m[i].y);
        if (xs==ys) continue;
        else
            merg(xs,ys,m[i].c);
    }
    for (int i=1; i<=q; i++)
        g<<rsp[i]<<'\n';
}