Cod sursa(job #2770592)

Utilizator cezarinfoTulceanu Cezar cezarinfo Data 21 august 2021 23:08:46
Problema Matrice 2 Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.05 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
FILE*in=fopen("matrice2.in","r");
FILE*out=fopen("matrice2.out","w");
int n,q,i,j;
int mat[305][305];
int uni[305][305];
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
struct str
{
    int x1,y1,x2,y2;
};
struct pct
{
    int x,y,val;
};
bool sor(pct f,pct g)
{
    return f.val>g.val;
}
pct p[110005];
int dad[110005],grad[110005],v[20005];
int fd(int a)
{
    if(dad[a]==0)
    {
        return a;
    }
    int ans=fd(dad[a]);
    dad[a]=ans;
    return ans;
}
void con(int a,int b)
{
    if(grad[fd(a)]==grad[fd(b)])
    {
        dad[fd(a)]=fd(b);
        grad[fd(b)]++;
    }
    else if(grad[fd(a)]<grad[fd(b)])
    {
        dad[fd(a)]=fd(b);
    }
    else
    {
        dad[fd(b)]=fd(a);
    }
}
void add(int a,int b)
{
    for(int k=a;k<=b;k++)
    {
        uni[p[k].x][p[k].y]=k;
        if(p[k].val==0)
        {
            return;
        }
        for(int h=0;h<=3;h++)
        {
            int px=p[k].x+dx[h];
            int py=p[k].y+dy[h];
            if(uni[px][py]!=0)
            {
                if(fd(uni[px][py])!=fd(k))
                {
                    con(uni[px][py],k);
                }
            }
        }
    }
}
str qe[20005];
vector<int> buc[400008];
int main()
{
    fscanf(in,"%d%d",&n,&q);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            fscanf(in,"%d",&mat[i][j]);
            p[(i-1)*n+j].val=mat[i][j];
            p[(i-1)*n+j].x=i;
            p[(i-1)*n+j].y=j;
        }
    }
    int y=n*n;
    int po=1;
    while(y!=0)
    {
        po*=2;
        y/=2;
    }
    sort(p+1,p+n*n+1,sor);
    for(i=1;i<=q;i++)
    {
        fscanf(in,"%d %d %d %d",&qe[i].x1,&qe[i].y1,&qe[i].x2,&qe[i].y2);
        buc[1].push_back(i);
    }
    int bk=1;
    for(int step=po;step>1;step/=2)
    {
        for(int pas=step/2;pas<po;pas+=step)
        {
            int ant=1;
            memset(dad,0,sizeof(dad));
            memset(uni,0,sizeof(uni));
            memset(grad,0,sizeof(grad));
            for(int it=0;it<buc[bk].size();it++)
            {
                add(ant,pas);
                ant=pas+1;
                if(p[pas].val==0)
                {
                    buc[2*bk].push_back(buc[bk][it]);
                }
                else if(uni[qe[buc[bk][it]].x1][qe[buc[bk][it]].y1]!=0&&uni[qe[buc[bk][it]].x2][qe[buc[bk][it]].y2]!=0&&fd(uni[qe[buc[bk][it]].x1][qe[buc[bk][it]].y1])==fd(uni[qe[buc[bk][it]].x2][qe[buc[bk][it]].y2]))
                {
                    buc[2*bk].push_back(buc[bk][it]);
                }
                else
                {
                    buc[2*bk+1].push_back(buc[bk][it]);
                }
            }
            bk++;
        }
    }
    for(i=bk;i<bk*2;i++)
    {
        for(int it=0;it<buc[i].size();it++)
        {
            v[buc[i][it]]=p[i-bk+1].val;
        }
    }
    for(i=1;i<=q;i++)
    {
        fprintf(out,"%d\n",v[i]);
    }
}