Cod sursa(job #2125440)

Utilizator patcasrarespatcas rares danut patcasrares Data 8 februarie 2018 14:47:20
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define DN 305
#define DQ 20005
#define DM 1000005
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int n,q,a[DN][DN],pr[DN*DN],l,c,lnou,cnou,l1,c1,l2,c2,f,ma,t,p1,p2,rez[DQ];
int dl[4]={0,0,1,-1};
int dc[4]={1,-1,0,0};
pair<pair<int,int>,pair<int,int> >r[DQ];
vector<pair<int,int> >v[DM];
int inside(int l,int c)
{
    if(l>=1&&l<=n)
        if(c>=1&&c<=n)
            return 1;
    return 0;
}
int getpr(int nod)
{
    if(pr[nod]==nod)
        return pr[nod];
    pr[nod]=getpr(pr[nod]);
    return pr[nod];
}
int main()
{
    fin>>n>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            fin>>a[i][j];
            ma=max(ma,a[i][j]);
            v[a[i][j]].pb({i,j});
        }
    for(int i=1;i<=q;i++)
    {
        fin>>l1>>c1>>l2>>c2;
        r[i].x.y=i;
        r[i].y.x=(l1-1)*n+c1;
        r[i].y.y=(l2-1)*n+c2;
    }
    for(int h=20;h>=0;h--)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                pr[(i-1)*n+j]=(i-1)*n+j;
        f=ma;
        sort(r+1,r+q+1);
        for(int i=q;i>=1;i--)
        {
            t=r[i].x.x+(1<<h);
            for(int j=f;j>=t;j--)
                for(auto z:v[j])
                {
                    l=z.x;
                    c=z.y;
                    for(int d=0;d<4;d++)
                    {
                        lnou=l+dl[d];
                        cnou=c+dc[d];
                        if(inside(lnou,cnou))
                            if(j<=a[lnou][cnou])
                            {
                                p1=getpr(n*(lnou-1)+cnou);
                                p2=getpr(n*(l-1)+c);
                                if(p1!=p2)
                                    pr[p1]=p2;
                            }
                    }
                }
            p1=getpr(r[i].y.x);
            p2=getpr(r[i].y.y);
            if(p1==p2)
                r[i].x.x=t;
            f=t-1;
        }
    }
    for(int i=1;i<=q;i++)
        rez[r[i].x.y]=r[i].x.x;
    for(int i=1;i<=q;i++)
        fout<<rez[i]<<'\n';
}