Cod sursa(job #2980142)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 16 februarie 2023 11:00:58
Problema Matrice 2 Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.19 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("matrice2.in");
ofstream g("matrice2.out");

const int nmax=302;
const int qmax= 2e4+1;
int v[nmax*nmax];
int par[nmax],siz[nmax];
bool vis[nmax];
int srt[nmax*nmax];

int n,q;

struct query{
  int st,dr,sol;
};
query qs[qmax];
int dn[4];

int mtov(int i, int j)
{
    return i*(n+2)+j;
}

int adj(int nod, int k)
{
    int next=nod+dn[k];
    return (v[next]==0)?-1:next;
}

struct arbnod{
    int st,dr;
    vector< query* > qs;
    arbnod(){}
};

int getp(int x)
{
    return (par[x]==0)?x:getp(par[x]);
}

bool adun(int a, int b)
{
    if(b==-1) return 0;
    a=getp(a);
    b=getp(b);
    if(a==b) return 0;
    if(siz[a]<siz[b]) swap(a,b);
    siz[a]+=siz[b];
    par[b]=a;
    return 1;
}

void dopar(int st, int dr)
{
    for(int i=st;i<=dr;i++)
    {
        vis[srt[i]]=1;
        for(int k=0;k<4;k++)
        {
            int nxt=adj(srt[i],k);
            if(nxt==-1||!vis[nxt]) continue;
            adun(srt[i],nxt);
        }
    }
}

void resetpad()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            par[mtov(i,j)]=vis[mtov(i,j)]=0;
        }
    }
}

bool cmp(const int a,const int b)
{
    return v[a]>v[b];
}

bool goodq(query* qer)
{
    return getp(qer->st)==getp(qer->dr);
}

void read()
{
    f>>n>>q;
    int k=0;
    dn[0]=1,dn[1]=-1,dn[2]=n+2,dn[3]=-n-2;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            f>>v[mtov(i,j)];
            srt[k++]=mtov(i,j);
        }
    }
    int a,b,c,d;
    for(int i=1;i<=q;i++)
    {
        f>>a>>b>>c>>d;
        qs[i].st=mtov(a,b);
        qs[i].dr=mtov(c,d);
    }
}

int32_t main()
{
    read();
    sort(srt,srt+n*n,cmp);
    queue<arbnod> u;
    u.push(arbnod());
    u.front().st=0,u.front().dr=n*n-1;
    for(int i=1;i<=q;i++) u.front().qs.push_back(&qs[i]);
    
    // for(int i=1;i<=n;i++)
    //     {
    //         for(int j=1;j<=n;j++)
    //         {
    //             cout<<getp(mtov(i,j))<<' ';
    //         }
    //         cout<<'\n';
    //     }
    
    int lastmid=0;
    while(!u.empty())
    {
        auto &nod=u.front();
        //cout<<"here "<<nod.st<<' '<<nod.dr<<' '<<nod.qs.size()<<';'<<v[srt[nod.st]]<<'\n';
        int mid=(nod.st+nod.dr)/2;
        if(mid<lastmid)
        {
            resetpad();
            lastmid=0;
        }
        
        dopar(lastmid,mid);
        // cout<<mid<<'\n';
        // for(int i=1;i<=n;i++)
        // {
        //     for(int j=1;j<=n;j++)
        //     {
        //         cout<<getp(mtov(i,j))<<' ';
        //     }
        //     cout<<'\n';
        // }
        lastmid=mid+1;
        if(nod.st==nod.dr)
        {
            for(auto e:nod.qs)
            {
                e->sol=v[srt[nod.st]];
            }
            u.pop();
            continue;
        }
        
        arbnod l,r;
        l.st=nod.st,l.dr=mid;
        r.st=mid+1,r.dr=nod.dr;
        
        for(auto e:nod.qs)
        {
            if(goodq(e)) l.qs.push_back(e);
            else r.qs.push_back(e);
        }
        
        if(!l.qs.empty())u.push(l);
        if(!r.qs.empty())u.push(r);
        u.pop();
    }
    
    for(int i=1;i<=q;i++)
    {
        g<<qs[i].sol<<'\n';
    }
    
    return 0;
}