Cod sursa(job #2920813)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 25 august 2022 22:47:31
Problema Matrice 2 Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>
#define nmax  90003
#define mmax 200003
#define imax 0x3f3f3f3f
using namespace std;

ifstream f("matrice2.in");
ofstream g("matrice2.out");

int v[nmax],c[mmax],s[mmax];
bool u[mmax];
int n,n2,q;

int par[nmax],h[nmax];


int st[nmax],k;
int tata(int nod)
{
    k=0;
    while(par[nod]!=nod)
    {
        st[k++]=nod;
        nod=par[nod];
    }
    for(int i=0;i<k;i++)
    {
        par[st[i]]=nod;
    }
    return nod;
}

bool merg(int a, int b)
{
    a=tata(a);
    b=tata(b);
    if(a==b) return 0;
    if(h[a]>h[b]) swap(a,b);
    h[b]+=h[a];
    par[a]=b;
    return 1;
}

bool cmp(const int &a, const int &b)
{
    return c[a]>c[b];
}

void pad()
{
    sort(s,s+n2*2,cmp);
    for(int i=0;i<n2;i++) par[i]=i;
    for(int i=0;i<n2*2;i++)
    {
        int a,b,c=s[i];
        if(c>=n2)
        {
            a=c-n2;
            b=c-n2-n;
        }
        else
        {
            a=c;
            b=c-1;
        }
        if(a>=0&&b>=0&&merg(a,b))
        {
            u[c]=1;
        }
    }
}

bool vis[nmax];
int qst,qdr;
int dfs(int nod) //i hate this, dont mind it
{
    if(nod==qdr) return v[nod];
    vis[nod]=1;
    int ans;
    if(nod+n<n2&&u[nod+n2+n]&&!vis[nod+n])
    {
        ans=dfs(nod+n);
        if(ans>0) return min(v[nod],ans);
    }
    if(nod-n>=0&&u[nod+n2]&&!vis[nod-n])
    {
        ans=dfs(nod-n);
        if(ans>0) return min(v[nod],ans);
    }
    if(nod+1<n2&&u[nod+1]&&!vis[nod+1])
    {
        ans=dfs(nod+1);
        if(ans>0) return min(v[nod],ans);
    }
    if(nod-1>=0&&u[nod]&&!vis[nod-1])
    {
        ans=dfs(nod-1);
        if(ans>0) return min(v[nod],ans);
    }
    return 0;
}

int main()
{
    f>>n>>q;
    n2=n*n;
    for(int i=0;i<n2;i++)
    {
        f>>v[i];
    }
    for(int i=0;i<n2;i++)
    {
        if(i%n!=0)c[i]=min(v[i],v[i-1]);
        else c[i]=-imax;
        if(i-n>=0) c[i+n2]=min(v[i],v[i-n]);
        else c[i+n2]=-imax;
        s[i]=i;
        s[i+n2]=i+n2;
    }
    pad();
    int a,b,c,d;
    for(int i=0;i<q;i++)
    {
        f>>a>>b>>c>>d;
        a--;b--;c--;d--;
        qst=a*n+b;
        qdr=c*n+d;
        for(int i=0;i<n2;i++) vis[i]=0;
        g<<dfs(qst)<<'\n';
    }
    return 0;
}