Cod sursa(job #2724372)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 16 martie 2021 23:17:44
Problema Matrice 2 Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 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)90500 + 5;

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

struct Number {
  int cell, value;
};

int n, m;

int dad[max_n];

int v[max_n];

Query qr[max_n];

Number vals[max_n];

vector<int> g[max_n];

bool operator < (const Number &a, const Number &b) {
  if (a.value == b.value) {
    return a.cell < b.cell;
  }
  return a.value > b.value;
}

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;
  int cnt = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      int val;
      in >> val;
      v[i * n + j] = val;
      vals[++cnt] = {i * n +j, val};
      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;
    }
  }
  sort(vals + 1, vals + n * n + 1);
  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 i = 1; i <= n * n; ++i) {
    int cell = vals[i].cell;
    for (int u : g[cell]) {
      if (v[u] >= vals[i].value) {
        if (Find(cell) == Find(u)) {
          continue;
        }
        join(Find(cell), Find(u), vals[i].value);
      }
    }
  }
  for (int i = 1; i <= m; ++i) {
    out << qr[i].ans << "\n";
  }
  return 0;
}