Cod sursa(job #3039529)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 28 martie 2023 17:38:37
Problema Matrice 2 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 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 = 150, QMAX = 20005;
int a[NMAX][NMAX], ans[QMAX], n;
vector<int> v[NMAX * NMAX];
map<pi, int> mp;
map<int, int> comp;
int pos(int i, int j)
{
    return (i - 1) * n + j;
}
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(int i = 0; i < v[comp[b]].size(); i++)
    {
        for(int j = 0; j < v[comp[a]].size(); j++)
        {
            if(mp[{v[comp[a]][j], v[comp[b]][i]}])
            {
                ans[mp[{v[comp[a]][j], v[comp[b]][i]}]] = val;
            }
        }
    }
    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 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];
            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;
        mp[{pos(x1, y1), pos(x2,y2)}] = mp[{pos(x2,y2), pos(x1, y1)}] = 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;
}