Cod sursa(job #2862928)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 6 martie 2022 00:46:08
Problema Matrice 2 Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb

#include <bits/stdc++.h>
using namespace std;

const int dim=309,inf=1e6;

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

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

int n,Q;
int v[dim][dim];
int nr[dim][dim];

int parent[dim*dim],sz[dim*dim];
int find_set(int x){
    if(x==parent[x]){
        return x;
    }
    return parent[x]=find_set(parent[x]);
}
void union_sets(int x,int y){
    int a=find_set(x);
    int b=find_set(y);
    if(a!=b){
        if(sz[a]<sz[b]){
            swap(a,b);
        }
        parent[b]=a;
        sz[a]+=sz[b];
    }
}

struct elem{
    int v,i,j;
    bool operator<(const elem &other) const{
        return v>other.v;
    }
};

vector<elem>w;

bool in(int i,int j){
    return 1<=i&&i<=n&&1<=j&&j<=n;
}

struct query{
    int x1,y1,x2,y2;
}q[dim*dim];

int st[dim*dim],dr[dim*dim],mij[dim*dim];

vector<int>verif[dim*dim];

signed main(){
            fin>>n>>Q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            fin>>v[i][j];
            nr[i][j]=(i-1)*n+j;
            w.push_back({v[i][j],i,j});
        }
    }
    sort(w.begin(),w.end());
    for(int i=1;i<=Q;i++){
        fin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2;
        st[i]=1;
        dr[i]=n*n;
    }
    bool changed=true;
    while(changed){
        changed=false;
        for(int i=0;i<n*n;i++){
            parent[i]=i;
            sz[i]=1;
            verif[i].clear();
        }
        for(int i=1;i<=Q;i++){
            if(st[i]<=dr[i]){
                mij[i]=(st[i]+dr[i])/2;
                verif[mij[i]].push_back(i);
                changed=true;
            }
        }
        for(int s=0;s<n*n;s++){
            int i=w[s].i;
            int j=w[s].j;
            for(int l=0;l<4;l++){
                int inou=i+dx[l];
                int jnou=j+dy[l];
                if(in(inou,jnou)&&v[inou][jnou]>=v[i][j]){
                    if(find_set(nr[inou][jnou])!=find_set(nr[i][j])){
                        union_sets(nr[inou][jnou],nr[i][j]);
                    }
                }
            }

            for(int x:verif[s]){
                if(find_set(nr[q[x].x1][q[x].y1])==find_set(nr[q[x].x2][q[x].y2])){
                    dr[x]=mij[x]-1;
                }else{
                    st[x]=mij[x]+1;
                }
            }
        }
    }
    for(int i=1;i<=Q;i++){
        fout<<w[dr[i]].v<<'\n';
    }
}