Cod sursa(job #2445133)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 2 august 2019 17:02:45
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

int n,q,di,t1,t2,k,nr,m,b[303][303],t[90009],matrice[303][303],ans[20002];

int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};

struct punct
{
    int x,y;
} v[90009];

struct seg
{
    int x1,x2,y1,y2,p;
} query[20002];

bool cmp(punct p1,punct p2)
{
    return matrice[p1.x][p1.y]>matrice[p2.x][p2.y];
}

bool cmp1(seg s1,seg s2)
{
    return ans[s1.p]>ans[s2.p];
}

void uneste(int x,int y)
{
    t[y]=x;
}

int tata(int x)
{
    if(x==t[x])
    {
        return x;
    }
    return t[x]=tata(t[x]);
}

int main()
{
    ifstream fin("matrice2.in");
    ofstream fout("matrice2.out");
    fin>>n>>q;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=n; ++j)
        {
            fin>>matrice[i][j];
            v[++nr].x=i;
            v[nr].y=j;
        }
    }
    sort(v+1,v+nr+1,cmp);
    for(int i=1; i<=q; ++i)
    {
        fin>>query[i].x1>>query[i].y1>>query[i].x2>>query[i].y2;
        query[i].p=i;
    }
    for(k=(1<<20); k; (k>>=1))
    {
        sort(query+1,query+q+1,cmp1);
        memset(b,0,sizeof(b));
        for(int i=1; i<=n*n; ++i)
        {
            t[i]=i;
        }
        int i,j;
        for(i=j=1,m=0; j<=q; ++j)
        {
            while(i<=n*n && ans[query[j].p]+k<=matrice[v[i].x][v[i].y])
            {
                b[v[i].x][v[i].y]=++m;
                for(di=0; di<4; ++di)
                {
                    if(b[v[i].x+dx[di]][v[i].y+dy[di]])
                    {
                        uneste(tata(b[v[i].x][v[i].y]),tata(b[v[i].x+dx[di]][v[i].y+dy[di]]));
                    }
                }
                ++i;
            }
            t1=tata(b[query[j].x1][query[j].y1]);
            t2=tata(b[query[j].x2][query[j].y2]);
            if(t1 && t1==t2)
            {
                ans[query[j].p]+=k;
            }
        }
    }
    for(int i=1; i<=q; ++i)
    {
        fout<<ans[i]<<"\n";
    }
    return 0;
}