Cod sursa(job #3267239)

Utilizator matei__bBenchea Matei matei__b Data 11 ianuarie 2025 10:30:46
Problema Matrice 2 Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
#define ll long long
#define ull unsigned long long
#define ld long double
#define chad char
#define mod 1'000'000'007
#define dim 100005
#define lim 1000000
#define BASE 31
#define NMAX 21'005
#define FOR(i,a,b) for(int i=(a); i<=(b); i++)
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define nr_biti __builtin_popcount
using namespace __gnu_pbds; 
using namespace std;

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

int t=1;

int n,q;
int a[303][303];

struct intre 
{
    int x1,y1,x2,y2;
}qs[20002];
int ans[20002];
vector<pair<int,pii> > v;

struct dsu 
{
    vector<int> t;
    vector<int> sz;

    void init(int n)
    {
        t=vector<int>(n+3,0);
        sz=vector<int>(n+3,0);

        for(int i=1; i<=n; i++)
        {
            t[i]=i;
            sz[i]=1;
        }
    }

    int root(int x)
    {
        if(x==t[x])
            return x;
        return t[x]=root(t[x]);
    }

    void unite(int x,int y)
    {
        x=root(x);
        y=root(y);

        if(x==y)
            return;

        if(sz[x]<sz[y])
            swap(x,y);

        sz[x]+=sz[y];
        t[y]=x;
    }

}dd;

bool used[303][303];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

bool in(int i,int j)
{
    return min(i,j)>=1 && max(i,j)<=n;
}

void solve()
{
    fin >> n >> q;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            fin >> a[i][j];
            v.pb(mp(a[i][j],mp(i,j)));
        }
    }

    for(int i=1; i<=q; i++)
        fin >> qs[i].x1 >> qs[i].y1 >> qs[i].x2 >> qs[i].y2;
    
    dd.init(n*n);
    sort(v.begin(),v.end(),greater<pair<int,pii> >());
    for(int i=0; i<n*n; i++)
    {
        used[v[i].second.first][v[i].second.second]=1;
        for(int d=0; d<4; d++)
        {
            int xn=v[i].second.first+dx[d];
            int yn=v[i].second.second+dy[d];

            if(!in(xn,yn))
                continue;

            if(used[xn][yn])
                dd.unite(n*(xn-1)+yn,(v[i].second.first-1)*n+v[i].second.second);
        }

        for(int j=1; j<=q; j++)
        {
            if(dd.root(n*(qs[j].x1-1)+qs[j].y1)==dd.root(n*(qs[j].x2-1)+qs[j].y2))
                ans[j]=max(ans[j],v[i].first);
        }
    }

    for(int i=1; i<=q; i++)
        fout << ans[i] << "\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    //cin >> t;
    while(t--)
        solve();

    return 0;
}