Cod sursa(job #3267650)

Utilizator matei__bBenchea Matei matei__b Data 11 ianuarie 2025 18:17:46
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.09 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;
    set<int> s[90005];

    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,int val)
    {
        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;

        if(s[x].size()<s[y].size())
            swap(s[x],s[y]);

        for(auto it:s[y])
        {
            if(s[x].find(it)!=s[x].end())
            {
                ans[it]=val;
            }
        }
        for(auto it:s[y])
            s[x].insert(it);

        s[y].clear();
    }

}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);

    for(int i=1; i<=q; i++)
    {
        int u=n*(qs[i].x1-1)+qs[i].y1;
        dd.s[u].insert(i);
        u=n*(qs[i].x2-1)+qs[i].y2;
        dd.s[u].insert(i);
    }

    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])
                continue;

            dd.unite(n*(xn-1)+yn,n*(v[i].second.first-1)+v[i].second.second,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;
}