Cod sursa(job #2858035)

Utilizator puica2018Puica Andrei puica2018 Data 26 februarie 2022 20:51:14
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;

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

struct query
{
    int x1,y1,x2,y2;
} queries[20005];

int n,q;
int a[305][305],l[20005],r[20005],cod[305][305],t[90005];
vector <int> e[1000005];
vector <query> aux[1000005];
pair <int,int> cell[90005];

int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

int root(int x)
{
    if(t[x]!=x)
        t[x]=root(t[x]);
    return t[x];
}

void unire(int x,int y)
{
    t[root(x)]=root(y);
}

int main()
{
    fin>>n>>q;
    for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) fin>>a[i][j];
    for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cod[i][j]=(i-1)*n+j;
    for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cell[cod[i][j]]=make_pair(i,j);
    for(int i=1; i<=q; i++)
        fin>>queries[i].x1>>queries[i].y1>>queries[i].x2>>queries[i].y2;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            for(int d=0; d<4; d++)
            {
                int iv=i+dx[d];
                int jv=j+dy[d];
                if(iv<1 || iv>n || jv<1 || jv>n)
                    continue;
                aux[min(a[i][j],a[iv][jv])].push_back({i,j,iv,jv});
            }
        }
    }
    for(int i=1; i<=q; i++) l[i]=1,r[i]=1000000;
    for(int pas=1; pas<=20; pas++)
    {
        for(int j=1; j<=1000000; j++) e[j].clear();
        for(int j=1; j<=q; j++)
        {
            if(l[j]==r[j]) continue;
            int mid=(l[j]+r[j])/2;
            e[mid].push_back(j);
        }
        for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) t[cod[i][j]]=cod[i][j];
        for(int v=1000000; v>=1; v--)
        {
            for(auto z:aux[v]) unire(cod[z.x1][z.y1],cod[z.x2][z.y2]);
            for(auto z:e[v])
            {
                if(root(cod[queries[z].x1][queries[z].y1])==root(cod[queries[z].x2][queries[z].y2]))
                    l[z]=v;
                else
                    r[z]=v;
            }
        }
    }
    for(int i=1; i<=q; i++)
        fout<<l[i]<<"\n";
    return 0;
}