Cod sursa(job #2738730)

Utilizator pregoliStana Andrei pregoli Data 6 aprilie 2021 12:05:26
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
///***********************
const int NMAX = 303;
int n, q, a[NMAX][NMAX];
const int dirs = 4, dirI[] = {1, -1, 0, 0}, dirJ[] = {0, 0, 1, -1};

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

bool lee(int mid, int i1, int j1, int i2, int j2) {
    if (a[i1][j1] < mid) {
        return false;
    }
    queue<pair<int, int>> q;
    array<bitset<NMAX>, NMAX> vis;
    q.emplace(i1, j1);
    vis[i1][j1] = true;
    while (!q.empty()) {
        auto [i, j] = q.front();
        q.pop();
        for (int dir = 0; dir < dirs; dir++) {
            int newI = i + dirI[dir];
            int newJ = j + dirJ[dir];
            if (isInside(newI, newJ) && !vis[newI][newJ] && a[newI][newJ] >= mid) {
                vis[newI][newJ] = true;
                q.emplace(newI, newJ);
            }
        }
    }
    return vis[i2][j2];
}

int main() {
    fin >> n >> q;
    int maxi = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            fin >> a[i][j];
            maxi = max(maxi, a[i][j]);
        }
    }
    while (q--) {
        int i1, j1, i2, j2;
        fin >> i1 >> j1 >> i2 >> j2;
        int l = 1, r = maxi, ans = -1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (lee(mid, i1, j1, i2, j2)) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        fout << ans << endl;
    }
    return 0;
}