Cod sursa(job #1877040)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 12 februarie 2017 21:03:56
Problema Matrice 2 Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream fin("matrice2.in");
ofstream fout("matrice2.out");

#define mp make_pair
#define f first
#define s second

int w[305][305];
int t[900005];
pair<pair<int,int> ,pair<int,int> >q[20010];
pair<int,pair<int,int> > v[900005];
int ans[20010];
int n,qr;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int i,j,mx;

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

inline int convert(int x,int y)
{
    return (x-1)*n+y;
}

void bs(int ls,int ld)
{
    if(ls>ld)
        return;
    int m = (ls+ld)>>1;
    memset(t,0,sizeof(t));
    memset(w,0,sizeof(w));
    int a,b;
    for(int i=n*n; v[i].f>=m; --i)
    {
        a = v[i].s.f;
        b = v[i].s.s;
        w[a][b]=1;
        for(int k=0; k<4; ++k)
            if(w[a+dx[k]][b+dy[k]])
            {
                if(root(convert(a+dx[k],b+dy[k]))!=root(convert(a,b)))
                    t[root(convert(a,b))]=root(convert(a+dx[k],b+dy[k]));
            }
    }
    int ok1=0;
    int ok2=0;
    for(int i=1; i<=qr; ++i)
    {
        if(root(convert(q[i].f.f,q[i].f.s))==root(convert(q[i].s.f,q[i].s.s)))
        {
            ans[i]=max(ans[i],m);
            ok2=1;
        }
        else
        ok1=1;
    }
    if(ok1)
        bs(ls,m-1);
    if(ok2)
        bs(m+1,ld);
}

int main()
{
    fin>>n>>qr;
    int k=0;
    for(i=1; i<=n; ++i)
    for(j=1; j<=n; ++j)
    {
        int x;
        fin>>x;
        v[++k]=mp(x,mp(i,j));
        mx=max(mx,x);
    }
    sort(v+1,v+n*n+1);
    for(i=1; i<=qr; ++i)
        fin>>q[i].f.f>>q[i].f.s>>q[i].s.f>>q[i].s.s;
    bs(1,mx);
    for(i=1; i<=qr; ++i)
        fout<<ans[i]<<'\n';
}