Cod sursa(job #2980171)

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

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

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

int n,q;

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

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

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

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

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

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++)
        {
            int nxt=mtov(i,j);
            siz[nxt]=1;
            par[nxt]=vis[nxt]=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]);
    int lastmid=0;
    resetpad();
    while(!u.empty())
    {
        auto &nod=u.front();
        int mid=(nod.st+nod.dr)/2;
        if(mid<lastmid)
        {
            resetpad();
            lastmid=0;
        }
        
        dopar(lastmid,mid);
        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;
}