Cod sursa(job #602353)

Utilizator SpiderManSimoiu Robert SpiderMan Data 10 iulie 2011 23:29:27
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
# include <algorithm>
# include <cstdio>
using namespace std;

const char *FIN = "matrice2.in", *FOU = "matrice2.out";
const int MAX_N = 305, MAX_X = 90005, MAX_Q = 20005;
const int dx[] = {-1, 0, 1,  0},
          dy[] = { 0, 1, 0, -1};

int N, Q, L, cnt;
int dp[MAX_N][MAX_N], X[MAX_X], Y[MAX_X], M[MAX_X], P[MAX_X], G[MAX_X], sol[MAX_Q], pp[MAX_Q], p[MAX_Q];
int X1[MAX_Q], Y1[MAX_Q], X2[MAX_Q], Y2[MAX_Q];
char B[MAX_N][MAX_N];

inline bool comp (int x, int y) {
    return M[x] > M[y];
}

inline bool comp2 (int x, int y) {
    return pp[x] > pp[y];
}

inline int search (int X) {
    if (X != G[X]) G[X] = search (G[X]);
    return G[X];
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d", &N, &Q);
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= N; ++j)
            dp[i][j] = ++L, X[L] = i, Y[L] = j, scanf ("%d", M + L), P[L] = L;
    for (int i = 1; i <= Q; ++i)
        scanf ("%d %d %d %d", X1 + i, Y1 + i, X2 + i, Y2 + i);
    sort (P + 1, P + L + 1, comp);
    for (cnt = 1; cnt < M[P[1]]; cnt <<= 1);
    for (; cnt; cnt >>= 1) {
        for (int i = 1; i <= Q; ++i) {
            pp[i] = sol[i] + cnt;
            p[i] = i;
        }
        sort (p + 1, p + Q + 1, comp2);
        for (int i = 1; i <= L; ++i)
            G[i] = i;
        for (int i = 1; i <= N; ++i)
            for (int j = 1; j <= N; ++j)
                B[i][j] = 0;
        int j = 1;
        for (int i = 1; i <= L; ) {
            for (int k = j; j <= Q && pp[p[j]] > M[P[i]]; ++j)
                if (search (dp[X1[p[j]]][Y1[p[j]]]) == search (dp[X2[p[j]]][Y2[p[j]]]))
                    sol[p[j]] += cnt;
            for (int k = i; i <= L && M[P[i]] == M[P[k]]; ++i) {
                B[X[P[i]]][Y[P[i]]] = 1;
                for (int l = 0; l < 4; ++l) {
                    int recx = X[P[i]] + dx[l], recy = Y[P[i]] + dy[l];
                    if (recx > 0 && recy > 0 && recx <= N && recy <= N && B[recx][recy])
                        G[G[search (dp[recx][recy])]] = G[P[i]];
                }
            }
        }
        for (; j <= Q; ++j)
            if (search (dp[X1[p[j]]][Y1[p[j]]]) == search (dp[X2[p[j]]][Y2[p[j]]]))
                sol[p[j]] += cnt;
    }
    for (int i = 1; i <= Q; ++i)
        printf ("%d\n", sol[i]);
}