Cod sursa(job #3217827)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 24 martie 2024 20:16:40
Problema Matrice 2 Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 309
#define QMAX 20009
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int n,q;
int a[NMAX][NMAX];
int lg;
pair <int,int> v[NMAX*NMAX];
int ans[QMAX];
int dsu[NMAX*NMAX];
int finddsu(int x);
bool comp(pair <int,int> x, pair <int,int> y)
{
    return a[x.first][x.second]>a[y.first][y.second];
}
struct query{int x1,y1,x2,y2,ans,poz;};
query Q[QMAX];
bool compq(query x, query y)
{
    return x.ans>y.ans;
}
int main()
{
    fin>>n>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            fin>>a[i][j];
            v[++lg]={i,j};
        }
    for(int i=1;i<=q;i++)
    {
        int x1,y1,x2,y2;
        fin>>x1>>y1>>x2>>y2;
        Q[i]={x1,y1,x2,y2,0,i};
    }
    sort(v+1,v+1+lg,comp);
    for(int step=(1<<20);step;step>>=1)
    {
        sort(Q+1,Q+1+q,compq);
        int m=1;
        for(int i=1;i<=lg;i++)
            dsu[i]=i;
        for(int i=1;i<=q;i++)
        {
            for(;m<=lg && Q[i].ans+step<=a[v[m].first][v[m].second];m++)
            {
                int poz=(v[m].first-1)*n+v[m].second;
                int up=poz-n, down=poz+n, left=poz-1, right=poz+1;
                int dm=finddsu(poz);
                if(up>=1 && a[v[m].first-1][v[m].second]>=Q[i].ans+step)
                    dsu[finddsu(up)]=dm;
                if(down<=lg && a[v[m].first+1][v[m].second]>=Q[i].ans+step)
                    dsu[finddsu(down)]=dm;
                if((poz-1)%n && a[v[m].first][v[m].second-1]>=Q[i].ans+step)
                    dsu[finddsu(left)]=dm;
                if(poz%n && a[v[m].first][v[m].second+1]>=Q[i].ans+step)
                    dsu[finddsu(right)]=dm;
            }
            if(finddsu((Q[i].x1-1)*n+Q[i].y1)==finddsu((Q[i].x2-1)*n+Q[i].y2))
                {
                    ans[Q[i].poz]+=step;
                    Q[i].ans+=step;
                }
        }
    }
    for(int i=1;i<=q;i++)
    {
        fout<<ans[i]<<'\n';
    }
    return 0;
}
int finddsu(int x)
{
    while(dsu[x]!=x)
        x=dsu[x];
    return x;
}