Cod sursa(job #2628184)

Utilizator loraclorac lorac lorac Data 14 iunie 2020 19:51:17
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
int num[305][305];
pair<int,int> inv[90005];
int val[90005],v[90005];
int link[90005],dim[90005];
pair<int,int> intra[90005];
int tata(int x)
{
    int cpy=x,aux;
    while(x!=link[x]) x=link[x];
    while(cpy!=link[cpy]) aux=cpy,cpy=link[cpy],link[aux]=x;
    return x;
}
void unite(int x,int y,int pas)
{
    x=tata(x);
    y=tata(y);
    if(x==y) return;
    if(dim[x]<dim[y]) swap(x,y);
    intra[y]={x,pas};
    dim[x]+=dim[y];
    link[y]=x;
}
bool mycmp(int a,int b)
{
    return val[a]>val[b];
}
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int n,q,x,y,xx,yy,cnt=0;
void dsu()
{
    for(int i=1;i<=cnt;++i)
    {
        link[v[i]]=v[i];
        dim[v[i]]=1;
        int x=inv[v[i]].first;
        int y=inv[v[i]].second;
        for(int d=0;d<4;++d)
        {
            int xx=x+dx[d];
            int yy=y+dy[d];
            if(1<=xx and xx<=n and 1<=yy and yy<=n and link[num[xx][yy]])
                unite(v[i],num[xx][yy],val[v[i]]);
        }
    }
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
    {
        ++cnt;
        cin>>val[cnt];
        num[i][j]=cnt;
        inv[cnt]={i,j};
        v[cnt]=cnt;
    }
    sort(v+1,v+cnt+1,mycmp);
    dsu();
    for(int i=1;i<=q;++i)
    {
        cin>>x>>y>>xx>>yy;
        int a=num[x][y],b=num[xx][yy];
        while(intra[a].first!=b and intra[b].first!=a)
        {
            if(intra[a].second>intra[b].second)
                a=intra[a].first;
            else b=intra[b].first;
        }
        if(intra[a].first==b) cout<<intra[a].second<<'\n';
        else cout<<intra[b].second<<'\n';
    }
    return 0;
}