Cod sursa(job #2449126)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 18 august 2019 12:02:41
Problema Matrice 2 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <bits/stdc++.h>

using namespace std;

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

const int xplus[] = {0, 0, -1, 1};
const int yplus[] = {1, -1, 0, 0};

struct Data {
    int x, y, val;

    bool operator< (const Data &other) const {
        return val > other.val;
    }
};

struct Queries {
    int ax, ay, bx, by;
    int initialpos;
    int answer;

    bool operator< (const Queries &other) const {
        return answer > other.answer;
    }
};

int findad(int a, vector<int> &dad) {
    if(a == dad[a])
        return a;
    return dad[a] = findad(dad[a], dad);
}

void link(int a, int b, vector<int> &dad, vector<int> &len) {
    a = findad(a, dad);
    b = findad(b, dad);

    if(len[a] < len[b]) {
        dad[a] = b;
        len[b] += len[a];
    } else {
        dad[b] = a;
        len[a] += len[b];
    }
}

bool isok(int x, int y, int n) {
    if(1 <= x && x <= n && 1 <= y && y <= n)
        return 1;
    return 0;
}

int main() {

    int n, nqr;
    in >> n >> nqr;

    vector<Data> v(n * n);
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++) {
            int val;
            in >> val;
            v[n * (i - 1) + j - 1] = {i, j, val};
        }
    sort(v.begin() + 1, v.end());
    vector<vector<int>> pos(n + 1, vector<int> (n + 1, 0));
    for(int i = 0; i < n * n; i ++)
        pos[v[i].x][v[i].y] = i;

    vector<Queries> q(nqr);
    for(int i = 0; i < nqr; i ++) {
        in >> q[i].ax >> q[i].ay >> q[i].bx >> q[i].by;
        q[i].initialpos = i;
    }

    vector<int> dad(n * n);
    vector<int> len(n * n);
    for(int step = (1 << 19); step; step >>= 1) {
        sort(q.begin(), q.end());
        for(int i = 0; i < n * n; i ++) {
            len[i] = 1;
            dad[i] = i;
        }

        int i = 0;
        for(auto &it : q) {
            while(i < n * n && v[i].val >= it.answer + step) {
                for(int dir = 0; dir < 4; dir ++) {
                    int newx = v[i].x + xplus[dir];
                    int newy = v[i].y + yplus[dir];
                    if(!isok(newx, newy, n))
                        continue;

                    int newpos = pos[newx][newy];
                    if(v[newpos].val >= it.answer + step && findad(newpos, dad) != findad(i, dad))
                        link(newpos, i, dad, len);
                }

                i ++;
            }

            if(findad(pos[it.ax][it.ay], dad) == findad(pos[it.bx][it.by], dad))
                it.answer += step;
        }
    }

    vector<int> sol(nqr);
    for(int i = 0; i < nqr; i ++)
        sol[q[i].initialpos] = q[i].answer;
    for(auto it : sol)
        out << it << "\n";

    return 0;
}