Cod sursa(job #2876149)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 23 martie 2022 08:37:33
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int N,Q,dad[305*305];
int cod[305][305];
vector<int> adj[305*305];
int sz[305*305];
int cnt=0;
int dx[4]= {1,0,-1,0};
int dy[4]= {0,1,0,-1};
bool viz[305*305];
struct node
{
    int val;
    int cnt;
};
node v[305*305];
struct query
{
    int x,y;
    int ans;
    int idx;
};
query q[20005],aux1[200005],aux2[200005];
void creategraph()
{
    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
            for(int dir=0; dir<4; dir++)
            {
                int xx=i+dx[dir];
                int yy=j+dy[dir];
                if(xx>=1&&xx<=N&&yy>=1&&yy<=N)
                {
                    adj[cod[i][j]].push_back(cod[xx][yy]);
                }
            }
        }
    }
}
bool cmp(node a,node b)
{
    return a.val>b.val;
}
bool cmp2(query a,query b)
{
    return a.ans>b.ans;
}
void restore()
{
    for(int i=1;i<=N;i++)
    {
        dad[i]=i;
        sz[i]=1;
        viz[i]=0;

    }
}
int find_dad(int node)
{
    while(dad[node]!=node) node=dad[node];
    return node;
}
void Dsu(int rk,int rp)
{
    if(sz[rk]>sz[rp]) swap(rk,rp);
    sz[rp]+=rk;
    dad[rk]=rp;
}
void uneste(int node)
{
    viz[node]=1;
    for(auto vec:adj[node])
    {
        if(viz[vec]==1)
        {
            int rk=find_dad(vec);
            int rp=find_dad(node);
            if(rk==rp) continue;
            Dsu(rk,rp);
        }
    }
}
int main ()
{

    f>>N>>Q;
    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
            int x;
            f>>x;
            cnt++;
            cod[i][j]=cnt;
            v[cnt].val=x;
            v[cnt].cnt=cnt;
        }
    }
    creategraph();
    N=N*N;
    sort(v+1,v+N+1,cmp);
    for(int i=1;i<=Q;i++)
    {
        int x1,y1,x2,y2;
        f>>x1>>y1>>x2>>y2;
        q[i].x=cod[x1][y1];
        q[i].y=cod[x2][y2];
        q[i].ans=0;
        q[i].idx=i;
       // cout<<q[i].x<<" "<<q[i].y<<'\n';
    }
    for(long long pas=(1<<30);pas>=1;pas/=2)
    {
        restore();
        int poz=1;
        int idx1=0,idx2=0;
        for(int i=1;i<=Q;i++)
        {
            while(poz<=N&&v[poz].val>=q[i].ans+pas)
            {
                uneste(v[poz].cnt);
                poz++;
            }
            int dad1=find_dad(q[i].x);
            int dad2=find_dad(q[i].y);
            if(dad1==dad2)
            {
                q[i].ans+=pas;
                aux1[++idx1]=q[i];
            }
            else
            {
                aux2[++idx2]=q[i];
            }
        }
        merge(aux1+1,aux1+idx1+1,aux2+1,aux2+idx2+1,q+1,cmp2);


    }
    vector<int> sol(Q+5,0);
    for(int i=1;i<=Q;i++)
    {
        sol[q[i].idx]=q[i].ans;
    }
    for(int i=1;i<=Q;i++)
    {
        g<<sol[i]<<'\n';
    }






}