Cod sursa(job #2763128)

Utilizator arsy19Homentcovschi Andrei arsy19 Data 11 iulie 2021 18:56:41
Problema Matrice 2 Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define MaxN 301
#define MaxEl 90001
#define MaxQ 20001

using namespace std;

ifstream fin("matrice2.in");
ofstream fout("matrice2.out");

int n,q,L,step,i,j,k;
int P[MaxEl],C[MaxEl],W[MaxN][MaxN];
int X[MaxEl],Y[MaxEl];
int Query[MaxQ],P2[MaxQ],X1[MaxQ],X2[MaxQ],Y1[MaxQ],Y2[MaxQ];
int Tata[MaxEl],Sol[MaxQ];
int dirx[]={-1,+0,+1,+0};
int diry[]={+0,-1,+0,+1};
bool viz[MaxN][MaxN];

bool cmp(int x,int y)
{
    return C[x]>C[y];
}

bool cmp2(int x,int y)
{
    return Query[x]>Query[y];
}

int rad(int x)
{
    if(Tata[x]!=x)return rad(Tata[x]);
    return x;
}

int main()
{
    fin>>n>>q;;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        {
           X[++L]=i;
           Y[L]=j;
           fin>>C[L];
           P[L]=L;
           W[i][j]=L;
        }
    }

    for(int i=1;i<=q;++i)
    fin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i];

    sort(P+1,P+L+1,cmp);

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

    for(;step;step>>=1)
    {
        for(int i=1;i<=q;++i)
        {
            Query[i]=Sol[i]+step;
            P2[i]=i;
        }

        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
            viz[i][j]=0;

            for(int i=1;i<=L;++i)
                Tata[i]=i;

        sort(P2+1,P2+q+1,cmp2);

        for(i=1,j=1;i<=L;)
        {
            for(;j<=q&&Query[P2[j]]>C[P[i]];++j)//query-urile cu valori mai mare decat C[P[i]]
                if(rad(W[X1[P2[j]]][Y1[P2[j]]])==rad(W[X2[P2[j]]][Y2[P2[j]]]))Sol[P2[j]]+=step;

            for(k=i;i<=L&&C[P[i]]==C[P[k]];++i)//marchez toate elementele egale cu C[P[i]]
            {
                viz[X[P[i]]][Y[P[i]]]=1;
                for(int dir=0;dir<4;++dir)
                 {
                     int cx=X[P[i]]+dirx[dir];
                     int cy=Y[P[i]]+diry[dir];
                     if(cx>=1&&cx<=n&&cy>=1&&cy<=n&&viz[cx][cy])
                        Tata[rad(W[cx][cy])]=P[i];
                 }
            }
        }

        for(;j<=q;++j)
            Sol[P2[j]]+=step;
    }

    for(int i=1;i<=q;++i)fout<<Sol[i]<<'\n';

    return 0;
}