Cod sursa(job #1434976)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 11 mai 2015 19:34:22
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <fstream>
#include <algorithm>

#define NMAX 20007
#define MMAX 307

using namespace std;

struct elem {
    int x, y, val ;
};

struct elem2{
    int x1, x2;
    int y1, y2;
    int ind;
    int Ans;
};

elem a[MMAX * MMAX];
elem2 q[NMAX];
int dad[MMAX * MMAX], H[MMAX * MMAX];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, -1, 1};
int n, m;

bool Cmp1(elem a, elem b){
    return a.val > b.val ;
}

bool Comp2(elem2 a, elem2 b){
    return a.Ans > b.Ans ;
}

bool Cmp3(elem2 a, elem2 b){
    return a.ind < b.ind ;
}

int code(int a, int b){
    return (a - 1) * n + b;
}

elem2 make_elem(int X1, int Y1, int X2 , int Y2 , int Ind){
    elem2 a;
    a.x1 = X1;
    a.y1 = Y1;
    a.x2 = X2;
    a.y2 = Y2;
    a.ind = Ind;
    a.Ans = 0;
    return a;
}

int Find(int Nod){
    if(Nod == dad[Nod])
        return Nod;
    return Find(dad[Nod]);
}

inline void unite(int a , int b){
    a = Find(a);
    b = Find(b);
    if(a == b)
        return ;
    if(H[a] > H[b]){
        H[a] += H[b];
        dad[b] = a;
    }
    else{
        H[b] += H[a];
        dad[a] = b;
    }
}

void solve(int x, int y, int n){
    dad[code(x,y)] = code(x, y);
    for(int i = 0; i <= 3; ++i){
        int Nodx = x + dx[i];
        int Nody = y + dy[i];
        if(dad[code(Nodx, Nody)] == 0)
            continue ;
        unite(code(Nodx, Nody), code(x, y));
    }
}

int main(){
    freopen("matrice2.in", "r", stdin);
    freopen("matrice2.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1 ; i <= n; ++i)
        for(int j = 1; j <= n; ++j){
            a[code(i, j)].x = i;
            a[code(i, j)].y = j;
            scanf("%d", &a[code(i, j)].val);
        }
    for(int i = 1; i <= m; ++i){
        int X1, Y1, X2, Y2;
        scanf("%d %d %d %d", &X1, &Y1, &X2, &Y2);
        q[i] = make_elem(X1, Y1, X2, Y2, i);
    }
    sort(a + 1, a + n * n + 1, Cmp1);
    for(int i = 30; i >= 0; --i){
        for(int j = 1; j <= n * n; ++j){
            dad[j] = 0;
            H[j] = 1;
        }
        sort(q + 1, q + m + 1, Comp2);
        int indice = 1 ;
        for(int j = 1; j <= m; ++j){
            for ( ; q[j].Ans + (1 << i) <= a[indice].val && indice <= n * n; ++indice)
                solve(a[indice].x, a[indice].y, n);
            int colt1 = Find(code(q[j].x1, q[j].y1));
            int colt2 = Find(code(q[j].x2, q[j].y2));
            if(colt1 == colt2 && colt1 && colt2)
                q[j].Ans += (1 << i);
        }
    }
    sort(q + 1, q + m + 1, Cmp3);
    for(int i = 1; i <= m; ++i)
        printf("%d\n", q[i].Ans);
    return 0;
}