Cod sursa(job #3039583)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 28 martie 2023 18:11:49
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
using ll = long long;
//#define int ll
using pi = pair<int,int>;
using pll = pair<ll, ll>;

#define pb push_back
#define x first
#define y second

const int MOD = 1e9+7, INF = 1e9, NMAX = 305, QMAX = 20005;
int a[NMAX][NMAX], comp[NMAX*NMAX], pos[NMAX][NMAX], ans[QMAX];
vector<int> v[NMAX * NMAX];
set<int> s[NMAX * NMAX];
struct lol
{
    int i, j, val;
};
bool cmp(const lol &a, const lol &b)
{
    return a.val > b.val;
}
vector<lol> vec;
void join(int a, int b, int val)
{
    if(comp[a] == comp[b])
        return;
    if(v[comp[a]].size() < v[comp[b]].size())
        swap(a, b);
    for(auto it: s[comp[b]])
    {
        if(s[comp[a]].find(it) != s[comp[a]].end())
        {
            ans[it] = val;
            s[comp[a]].erase(s[comp[a]].find(it));
        }
        else
            s[comp[a]].insert(it);
    }
    int aux = comp[b];
    for(int i = 0; i < v[comp[b]].size(); i++)
        v[comp[a]].pb(v[comp[b]][i]);
    for(int i = 0; i < v[aux].size(); i++)
        comp[v[aux][i]] = comp[a];
    v[aux].clear();
}
void solve()
{
    ll n, i, q, j, cnt = 0, x1, y1, x2, y2;
    cin >> n >> q;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
        {
            cin >> a[i][j];
            pos[i][j] = ++cnt;
            comp[pos[i][j]] = cnt;
            v[cnt].pb(pos[i][j]);
            vec.pb({i, j, a[i][j]});
        }
    for(i = 1; i <= q; i++)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        s[comp[pos[x1][y1]]].insert(i);
        s[comp[pos[x2][y2]]].insert(i);
    }
    sort(vec.begin(), vec.end(), cmp);
    for(i = 0; i < vec.size(); i++)
    {
        lol u = vec[i];
        int posu = pos[u.i][u.j];
        if(u.i != 1 && a[u.i-1][u.j] >= u.val)
            join(pos[u.i-1][u.j], posu, u.val);
        if(u.j != 1 && a[u.i][u.j-1] >= u.val)
            join(pos[u.i][u.j-1], posu, u.val);
        if(u.i != n && a[u.i+1][u.j] >= u.val)
            join(pos[u.i+1][u.j], posu, u.val);
        if(u.j != n && a[u.i][u.j+1] >= u.val)
            join(pos[u.i][u.j+1], posu, u.val);
    }
    for(i = 1; i <= q; i++)
        cout << ans[i] << '\n';
}
int main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    int T;
    T = 1;
    while(T--)
        solve();
    return 0;
}