Cod sursa(job #1964422)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 13 aprilie 2017 13:47:06
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
const int Nmax=310;
const int Qmax=20010;
int lin[4]={1,-1,0,0};
int col[4]={0,0,1,-1};
int POZ[Nmax][Nmax];
int val[Nmax*Nmax],X[Nmax*Nmax],Y[Nmax*Nmax],P[Nmax*Nmax];
int tata[Nmax*Nmax];
int Query[Qmax],P2[Qmax],sol[Qmax];
int X1[Qmax],Y1[Qmax],X2[Qmax],Y2[Qmax];
bool B[Nmax][Nmax];
bool cmp(int a,int b)
{
    return val[a]>val[b];
}
bool cmp2(int a,int b)
{
    return Query[a]>Query[b];
}
int cauta_tata(int x)
{
    if(x!=tata[x]) tata[x]=cauta_tata(tata[x]);
    return tata[x];
}
int main()
{
    int n,q,i,j,k,poz=0,p,step,cx,cy;
    fin>>n>>q;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            poz++;
            POZ[i][j]=poz;
            X[poz]=i;
            Y[poz]=j;
            fin>>val[poz];
            P[poz]=poz;
        }
    }
    for(i=1;i<=q;i++) fin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i];
    sort(P+1,P+1+poz,cmp);

    for(step=1;step<val[P[1]];step<<=1);

    for( ; step ; step>>=1)
    {
        for(i=1;i<=q;i++)
        {
            Query[i]=sol[i]+step;
            P2[i]=i;
        }
        sort(P2+1,P2+1+q,cmp2);

        for(i=1;i<=poz;i++)
            {
                tata[i]=i;
                B[X[i]][Y[i]]=0;
            }
        for(j=1,i=1;i<=poz;)
        {
            for(; j<=q && Query[P2[j]]>val[P[i]];j++)
            {
                if(cauta_tata(POZ[X1[P2[j]]][Y1[P2[j]]])==cauta_tata(POZ[X2[P2[j]]][Y2[P2[j]]]) ) sol[P2[j]]+=step;
            }
            for(k=i ; i<=poz && val[P[i]]==val[P[k]];i++)
            {
                B[X[P[i]]][Y[P[i]]]=1;

                for(p=0;p<4;p++)
                {
                    cx= X[P[i]]+lin[p];
                    cy= Y[P[i]]+col[p];
                    if(cx>0 && cy>0 && cx<=n && cy<=n && B[cx][cy]) tata[ tata[cauta_tata(POZ[cx][cy])] ]= tata[P[i]];
                }
            }
        }
        for(;j<=q;j++)
        {
            if(cauta_tata(POZ[X1[P2[j]]][Y1[P2[j]]])==cauta_tata(POZ[X2[P2[j]]][Y2[P2[j]]]) ) sol[P2[j]]+=step;
        }
    }
    for(i=1;i<=q;i++) fout<<sol[i]<<"\n";
}