Cod sursa(job #3039517)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 28 martie 2023 17:29:02
Problema Matrice 2 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 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];
map<pi, int> mp;
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 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;
        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;
}