Cod sursa(job #1083558)

Utilizator leontinLeontin leontin Data 16 ianuarie 2014 03:42:40
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.42 kb
#include <fstream>
#include <algorithm>

using namespace std;

#define n_max 310
#define nr_el 90010
#define prob 20010
#define maxxxi 4

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


const int dirx[maxxxi] = {-1, 0, 1, 0};
const int diry[maxxxi] = {0, 1, 0, -1};

int N, Q, L;
char B[n_max][n_max];
int W[n_max][n_max];
int X[nr_el], Y[nr_el], C[nr_el], P[nr_el];
int G[nr_el];
int Sol[prob];
int ask[prob], P2[prob];
int X1[prob], Y1[prob], X2[prob], Y2[prob];

  int cmp(int x, int y)
{
    return C[x] > C[y];
}

  int cmp2(int x, int y)
{
    return ask[x] > ask[y];
}

  int cautare(int x)
{
    if (x != G[x]) G[x] = cautare(G[x]);
    return G[x];
}

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

    int i, j, k, p, step, cx, cy;

    fin >> N >> Q;

    for (i = 1; i <= N; i++)
        for (j = 1; j <= N; j++)
        {
            L++;
            W[i][j] = L;
            X[L] = i, Y[L] = j;
            fin >> C[L];
            P[L] = L;
        }

    for (i = 1; i <= Q; i++) fin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];

    sort(P+1, P+L+1, cmp);

    for (step = 1; step < C[P[1]]; step <<= 1);

    for (; step; step >>= 1)
    {
        for (i = 1; i <= Q; i++)
        {
            ask[i] = Sol[i] + step;
            P2[i] = i;
        }

        sort(P2+1, P2+Q+1, cmp2);

        for (i = 1; i <= L; i++) G[i] = i;

        for (i = 1; i <= N; i++)
            for (j = 1; j <= N; j++) B[i][j] = 0;

        for (i = 1, j = 1; i <= L; )
        {
            for (k = j; j <= Q && ask[P2[j]] > C[P[i]]; j++)
                if (cautare( W[X1[P2[j]]][Y1[P2[j]]] ) == cautare( W[X2[P2[j]]][Y2[P2[j]]] )) Sol[P2[j]] += step;

            for (k = i; i <= L && C[P[i]] == C[P[k]]; i++)
            {
                B[X[P[i]]][Y[P[i]]] = 1;

                for (p = 0; p < maxxxi; p++)
                {
                    cx = X[P[i]] + dirx[p];
                    cy = Y[P[i]] + diry[p];

                    if (cx > 0 && cy > 0 && cx <= N && cy <= N && B[cx][cy])
                        G[G[ cautare(W[cx][cy]) ]] = G[P[i]];
                }
            }
        }

        for (; j <= Q; j++)
            if (cautare( W[X1[P2[j]]][Y1[P2[j]]] ) == cautare( W[X2[P2[j]]][Y2[P2[j]]] )) Sol[P2[j]] += step;
    }

    for (i = 1; i <= Q; i++) fout << Sol[i] << "\n";

    return 0;
}