Cod sursa(job #1086303)

Utilizator Aleks10FMI - Petrache Alex Aleks10 Data 17 ianuarie 2014 22:42:00
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>

#define N_MAX 90005
#define N_MIC 301

using namespace std;

int n,q,i,j,a[N_MIC][N_MIC],nr,rasp[20001],t[N_MIC],pas,b[N_MIC][N_MIC],m,di,t1,t2;
struct punct{
    int x;
    int y;
} v[N_MAX];
struct questions{
    int x1;
    int x2;
    int y1;
    int y2;
    int p;
}que[20005];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};

bool cmp(punct p1, punct p2){
    return a[p1.x][p1.y]>a[p2.x][p2.y];
}
bool cmp2(questions s1, questions s2){
    return rasp[s1.p]>rasp[s2.p];
}

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

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

int main()
{
    ifstream f("matrice2.in");
    ofstream g("matrice2.out");
    f>>n>>q;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            f>>a[i][j];
            v[++nr].x=i;
            v[nr].y=j;
        }
    sort(v+1,v+nr+1,cmp);
    for(i=1;i<=q;i++){
        f>>que[i].x1>>que[i].y1>>que[i].x2>>que[i].y2;
        que[i].p=i;
    }
    for(pas=(1<<20);pas!=0;pas=pas/2){
        sort(que+1,que+q+1,cmp2);
        memset(b,0,sizeof(b));
        for(i=1;i<=n*n;i++){
            t[i]=i;
        }
        for(i=j=1;j<=q;j++){
            m=0;
            while(i<=n*n && rasp[que[j].p]+pas<=a[v[i].x][v[i].y]){
                b[v[i].x][v[i].y]=++m;
                for(di=0;di<=3;di++)
                    if(b[v[i].x+dx[di]][v[i].y+dy[di]])
                        lip(father(b[v[i].x][v[i].y]), father(b[v[i].x+dx[di]][v[i].y+dy[di]]));
                        i++;
            }
            t1=father(b[que[j].x1][que[j].y1]);
            t2=father(b[que[j].x2][que[j].y2]);
            if(t1!=0 && t1==t2)
                rasp[que[j].p]+=pas;
        }
    }

    for(i=1;i<=q;i++)
        g<<rasp[i]<<'\n';

    return 0;
}