Cod sursa(job #2073842)

Utilizator cipri321Marin Ciprian cipri321 Data 23 noiembrie 2017 19:24:55
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#define DN 301
#define DQ 20001
using namespace std;
struct QUERY
{
    int x1,y1,x2,y2,val,ind;
    bool operator<(const QUERY &other) const
    {
        return val>other.val;
    }
};
struct EL
{
    int x,y,val;
    bool operator<(const EL &other) const
    {
        return val>other.val;
    }
    void make(int i,int j,int v)
    {
        x=i,y=j,val=v;
    }
};
ifstream fi("matrice2.in");
ofstream fo("matrice2.out");
int n,nrq;
QUERY Q[DQ];
int A[DN][DN];
int P[DN*DN];
EL M[DN*DN];
int U[DN][DN];
int R[DQ];
int radacina(int a)
{
    if(P[a]==0)
        return a;
    return P[a]=radacina(P[a]);
}
void reuniune(int a,int b)
{
    if(radacina(a)!=radacina(b))
        P[radacina(a)]=radacina(b);
}
int ins(int l,int c)
{
    return 1<=l&&l<=n&&1<=c&&c<=n;
}
int dl[]={-1,0,1,0},dc[]={0,1,0,-1};
void baga(int ind,int val)
{
    int l=M[ind].x,c=M[ind].y;
    for(int d=0;d<4;d++)
    {
        int ln=l+dl[d],cn=c+dc[d];
        if(ins(ln,cn)&&A[ln][cn]>=val)
            reuniune(U[ln][cn],ind);
    }
}
int main()
{
    fi>>n>>nrq;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            fi>>A[i][j];
            M[i*(n-1)+j].make(i,j,A[i][j]);
        }
    sort(M+1,M+n*n+1);
    for(int i=1;i<=n*n;i++)
        U[M[i].x][M[i].y]=i;
    for(int i=1;i<=nrq;i++)
    {
        fi>>Q[i].x1>>Q[i].y1>>Q[i].x2>>Q[i].y2;
        Q[i].ind=i;
    }
    for(int p=(1<<20);p>0;p>>=1)
    {
        memset(P,0,sizeof(P));
        sort(Q+1,Q+nrq+1);
        int ind=1;
        for(int i=1;i<=nrq;i++)
        {
            int cat=Q[i].val+p;
            while(M[ind].val>=cat&&ind<=n*n)
            {
                baga(ind,cat);
                ind++;
            }
            if(radacina(U[Q[i].x1][Q[i].y1])==radacina(U[Q[i].x2][Q[i].y2]))
                Q[i].val+=p;
        }
    }
    for(int i=1;i<=nrq;i++)
        R[Q[i].ind]=Q[i].val;
    for(int i=1;i<=nrq;i++)
        fo<<R[i]<<"\n";
    fi.close();
    fo.close();
    return 0;
}