Cod sursa(job #2724365)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 16 martie 2021 23:09:57
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;

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

const int ox[] = {0, 1, 0, -1};
const int oy[] = {1, 0, -1, 0};
const int max_n = (int)1e5 + 5;
const int limit = (int)1e6 + 5;

struct Query {
  int x1, y1, x2, y2, ans;
};

int n, m;

int dad[max_n];

int v[max_n];

Query qr[max_n];

vector<int> vals[limit], g[max_n];

bitset<max_n> used;

int Find(int u) {
  if (u == dad[u]) {
    return u;
  }
  return dad[u] = Find(dad[u]);
}

set<int> st[max_n];

void join(int u, int v, int value) {
  for (int x : st[u]) {
    if (st[v].find(x) != st[v].end()) {
      qr[x].ans = value;
      st[v].erase(x);
      st[u].erase(x);
    } else {
      st[v].insert(x);
      st[u].erase(x);
    }
  }
  dad[u] = v;
}

int main() {
  in >> n >> m;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      int val;
      in >> val;
      v[i * n + j] = val;
      vals[val].push_back(i * n + j);
      for (int k = 0; k < 4; ++k) {
        int nx = i + ox[k];
        int ny = j + oy[k];
        if (nx >= 1 && ny >= 1 && nx <= n && ny <= n) {
          g[i * n + j].push_back(nx * n + ny);
        }
      }
      dad[i * n +j] = i * n + j;
    }
  }
  auto f = [&](int x, int y) {
    return n * x + y;
  };
  for (int i = 1; i <= m; ++i) {
    in >> qr[i].x1 >> qr[i].y1 >> qr[i].x2 >> qr[i].y2;
    st[f(qr[i].x1, qr[i].y1)].insert(i);
    st[f(qr[i].x2, qr[i].y2)].insert(i);
  }
  for (int val = limit - 5; val > 0; --val) {
    for (int cell : vals[val]) {
      used[cell] = 1;
      for (int u : g[cell]) {
        if (v[u] >= val) {
          if (Find(cell) == Find(u)) {
            continue;
          }
          join(Find(cell), Find(u), val);
        }
      }
    }
  }
  for (int i = 1; i <= m; ++i) {
    out << qr[i].ans << "\n";
  }
  return 0;
}