Cod sursa(job #2715938)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 4 martie 2021 13:28:12
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda simularedelacasi1 Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

int mat[305][305];

int ans[20005];

set <int>s[90005];

int tata[90005];

struct boi
{
    int val,x,y;
};
vector<boi>v;
bool mycmp(boi x,boi y)
{
    return x.val<y.val;
}

int find(int nod)
{
    int aux=nod;
    while(tata[nod]>0)
    {
        nod=tata[nod];
    }
    while(tata[aux]>0)
    {
        int temp=tata[aux];
        tata[aux]=nod;
        aux=temp;
    }
    return nod;
}
void unite(int x,int y,int val)
{
    x=find(x);
    y=find(y);
    if(tata[x]>tata[y])
    {
        swap(x,y);
    }
    tata[x]+=tata[y];
    tata[y]=x;
    for(auto it=s[y].begin();it!=s[y].end();it++)
    {
        auto temp=s[x].find(*it);
        if(temp==s[x].end())
        {
            s[x].insert(*it);
        }
        else
        {
            ans[*it]=val;
            s[x].erase(*it);
        }
    }
}


int main()
{
    ifstream cin("matrice2.in");
    ofstream cout("matrice2.out");
    int q,ai,bi,aj,bj,n;
    cin>>n>>q;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            cin>>mat[i][j];
            tata[(i-1)*n+j]=-1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(j>1)
            {
                v.push_back({min(mat[i][j],mat[i][j-1]),(i-1)*n+j,(i-1)*n+j-1});
            }
            if(i>1)
            {
                v.push_back({min(mat[i][j],mat[i-1][j]),(i-1)*n+j,(i-2)*n+j});
            }
        }
    }
    sort(v.begin(),v.end(),mycmp);
    for(int i=1; i<=q; ++i)
    {
        cin>>ai>>aj>>bi>>bj;
        s[(ai-1)*n+aj].insert(i);
        s[(bi-1)*n+bj].insert(i);
    }
    for(int i=0;i<v.size();i++)
    {
        if(find(v[i].x)==find(v[i].y))
        {
            continue;
        }
        unite(v[i].x,v[i].y,v[i].val);
    }
    for(int i=1;i<=q;i++)
    {
        cout<<ans[i]<<"\n";
    }
    return 0;
}