Cod sursa(job #2697917)

Utilizator bem.andreiIceman bem.andrei Data 20 ianuarie 2021 13:43:31
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("matrice2.in");
ofstream w("matrice2.out");
int n, qu, maxim, t[90003], fin[90003], val[90003];
vector<pair<int, int>>sol, q, v;
int tata(int a){
    if(a!=t[a]){
        t[a]=tata(t[a]);
    }
    return t[a];
}
int main()
{
    r>>n>>qu;
    int vec[]={-n, -1, 1, n};
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int x;
            r>>x;
            v.push_back(make_pair(x, i*n+j));
            val[i*n+j]=x;
            maxim=max(maxim, x);
        }
    }
    sort(v.begin(), v.end());
    for(int i=0;i<qu;i++){
        sol.push_back(make_pair(0, i));
        int a, b, c, d;
        r>>a>>b>>c>>d;
        q.push_back(make_pair((a-1)*n+b-1, (c-1)*n+d-1));
    }
    int put=1;
    while(put*2<=maxim){
        put*=2;
    }
    while(put!=0){
        sort(sol.begin(), sol.end());
        for(int i=0;i<n*n;i++){
            t[i]=i;
        }
        int ind=n*n-1;
        for(int i=sol.size()-1;i>=0;i--){
            while(v[ind].first>=sol[i].first+put){
                int a=v[ind].second;
                for(int j=0;j<4;j++){
                    if(a+vec[j]<0 || a+vec[j]>=n*n){
                        continue;
                    }
                    if(val[a+vec[j]]>v[ind].first){
                        t[tata(a+vec[j])]=a;
                    }
                }
                ind--;
            }
            if(tata(q[sol[i].second].first)==tata(q[sol[i].second].second)){
                sol[i].first+=put;
            }
        }
        put/=2;
    }
    for(int i=0;i<qu;i++){
        fin[sol[i].second]=sol[i].first;
    }
    for(int i=0;i<qu;i++){
        w<<fin[i]<<"\n";
    }
    return 0;
}