Cod sursa(job #905161)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 5 martie 2013 17:17:46
Problema Matrice 2 Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <queue>
#define DN 313
#define DQ 20005
#define per pair<int,int>
#define f first
#define s second
#define mp make_pair
#define t1  val [ Q[i].f.f ][ Q[i].f.s ]
#define t2  val [ Q[i].s.f ][ Q[i].s.s ]
using namespace std;

int a[DN][DN],t[DN*DN],val[DN][DN],rez[DQ],q,n,x;
bool viz[DN][DN];
pair< per , per > Q[DQ];
queue< per > qu;
int ii[]={-1,1,0,0},jj[]={0,0,1,-1};

bool cmp(int a,int b)
{
    return a>b;
}
void make(int nod,int root)
{
    while(t[nod]!=nod)
    {
        int next_nod=t[nod];
        t[nod]=root;
        nod=next_nod;
    }
    t[nod]=root;
}

int get_t(int nod)
{
    while(t[nod]!=nod)
        nod=t[nod];
    return nod;
}

void reconst(int mini)
{
    //cout<<mini<<endl;
    memset(viz,0,sizeof(viz));
    for(int i=1;i<=n*n;++i)
        t[i]=i;

    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            if(a[i][j]>=mini && viz[i][j]==0)
            {
                qu.push(make_pair(i,j));
                while(qu.size())
                {
                    int x=qu.front().f;
                    int y=qu.front().s;

                    viz[x][y]=true;
                    qu.pop();

                    int root=get_t( val[x][y] );
                    for(int t=0;t<4;++t)
                    {
                        int xx=x+ii[t];
                        int yy=y+jj[t];
                        if( xx >=1 && xx<=n && yy>=1 && yy<=n && !viz[xx][yy] && a[xx][yy]>=mini)
                        {
                            viz[xx][yy]=true;
                            make(val[xx][yy],root);
                            qu.push(mp(xx,yy));
                        }
                    }
                }
            }
}
void caut(int st,int dr)
{
    if(st<=dr)
    {
        int mij=(st+dr)/2;
        reconst(mij);

        bool m=false,p=false;

        for(int i=1;i<=q;++i)
        {
            if(t[ t1 ] != t[ t2 ] )
                m=true;
            else
                rez[i]=max(rez[i],mij),p=true; // caut mai mare
        }
        if(m==true)
            caut(st,mij-1);
        if(p==true)
            caut(mij+1,dr);
    }
}


int main()
{
    int hmax=0;
    ifstream f("matrice2.in");
    ofstream g("matrice2.out");
    f>>n>>q;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            {
                f>>a[i][j];
                hmax=max(hmax,a[i][j]);
                val[i][j]=++x;
            }


    for(int i=1;i<=q;++i)
        f>>Q[i].f.f>>Q[i].f.s>>Q[i].s.f>>Q[i].s.s;

    caut(1,hmax);

    for(int i=1;i<=q;++i)
        g<<rez[i]<<"\n";

    return 0;
}