Cod sursa(job #2391432)

Utilizator onipreponiprep oniprep Data 28 martie 2019 20:45:31
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
typedef pair<int,int> Pair;
typedef pair<int,Pair> Pair2;
const int N=309,K=20009;
Pair v[N*N];
Pair2 q[K];
int t[N*N],r[N*N],ans[K],prez[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int n,k,Max;
int cmp(Pair2 x,Pair2 y)
{
    return ans[x.first]>ans[y.first];
}
bool verif(int x,int y)
{
    if(prez[x][y]==0)
        return false;
    return true;
}
int root(int x)
{
    int y=x;
    for(y=x;y!=t[y];y=t[y]);
    for(;x!=t[x];)
    {
        int z=t[x];
        t[x]=y;
        x=z;
    }
    return y;
}
void unite(int x,int y)
{
    if(r[x]>r[y])
        t[y]=x;
    else
        t[x]=y;
    if(r[x]==r[y])
        r[y]++;
}
void solve()
{
    sort(v+1,v+n*n+1);
    int step;
    for(step=1;step<Max;step<<=1);
    for(;step;step>>=1)
    {
        sort(q+1,q+k+1,cmp);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                prez[i][j]=0;
        for(int i=1;i<=n*n;i++)
            r[i]=1,t[i]=i;
        int last=n*n;
        for(int i=1;i<=k;i++)
        {
            while(v[last].first>=ans[q[i].first]+step)
            {
                int x=v[last].second/n+1,y=v[last].second%n;
                if(y==0)
                    x--,y=n;
                prez[x][y]=1;
                for(int j=0;j<4;j++)
                {
                    if(verif(x+dx[j],y+dy[j])==true)
                    {
                        int X=root((x-1)*n+y),Y=root((x+dx[j]-1)*n+y+dy[j]);
                        if(X!=Y)
                            unite(X,Y);
                    }
                }
                last--;
            }
            int X=root(q[i].second.first),Y=root(q[i].second.second);
            if(X==Y)
                ans[q[i].first]+=step;
        }
    }
}
int main()
{
    fin>>n>>k;
    int nr=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int x;
            fin>>x;
            Max=max(Max,x);
            nr++;
            v[nr]={x,nr};
        }
    for(int i=1;i<=k;i++)
    {
        int x,y,z,w;
        fin>>x>>y>>z>>w;
        q[i]={i,{(x-1)*n+y,(z-1)*n+w}};
    }
    solve();
    for(int i=1;i<=k;i++)
        fout<<ans[i]<<'\n';
    return 0;
}