Cod sursa(job #1447280)

Utilizator geniucosOncescu Costin geniucos Data 4 iunie 2015 00:04:18
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

int nr, N, M, t[90009], ap[90009], ans[20009], x[20009], y[20009], auxx[20009], auxy[20009], prefer[20009], ind[20009], cod[309][309], a[309][309];
vector < int > edges[90009];
pair < int , int > v[90009];

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

void unite (int x, int y)
{
    x = tata (x), y = tata (y);
    if (x != y)
        t[x] = y;
}

void baga (int nod)
{
    for (vector < int > :: iterator it = edges[nod].begin (); it != edges[nod].end (); it ++)
        if (ap[*it])
            unite (nod, *it);
    ap[nod] = 1;
}

void Clear ()
{
    for (int i=1; i<=nr; i++)
        t[i] = i, ap[i] = 0;
}

void add_edge (int x, int y)
{
    edges[x].push_back (y);
    edges[y].push_back (x);
}

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++)
        cod[i][j] = ++nr;

for (int i=1; i<=N; i++)
    for (int j=1; j<=N; j++)
    {
        if (i < N)
            add_edge (cod[i][j], cod[i+1][j]);
        if (j < N)
            add_edge (cod[i][j], cod[i][j+1]);
    }

for (int i=1; i<=N; i++)
    for (int j=1; j<=N; j++)
        scanf ("%d", &a[i][j]), v[cod[i][j]].first = a[i][j], v[cod[i][j]].second = cod[i][j];

sort (v + 1, v + nr + 1);
reverse (v + 1, v + nr + 1);

for (int i=1; i<=M; i++)
{
    int a1, b1, a2, b2;
    scanf ("%d %d %d %d", &a1, &b1, &a2, &b2);
    x[i] = cod[a1][b1], y[i] = cod[a2][b2], ind[i] = i;
}

for (int curr_i=19; curr_i>=0; curr_i--)
{
    Clear ();
    int add = 1 << curr_i, p = 1;
    for (int i=1; i<=M; i++)
    {
        while (p <= nr && v[p].first >= ans[ind[i]] + add)
            baga (v[p++].second);
        if (tata (x[ind[i]]) == tata (y[ind[i]]))
            prefer[i] = 1, ans[ind[i]] += add;
        else
            prefer[i] = 0;
    }

    int lx = 0, ly = 0, py = 1, l = 0;

    for (int i=1; i<=M; i++)
        if (prefer[i])
            auxx[++lx] = ind[i];
        else
            auxy[++ly] = ind[i];

    for (int i=1; i<=lx; i++)
    {
        while (ans[auxy[py]] >= ans[auxx[i]] && py <= ly)
            ind[++l] = auxy[py++];
        ind[++l] = auxx[i];
    }
    while (py <= ly)
        ind[++l] = auxy[py++];

    if (ans[ind[1]] < ans[ind[2]])
        printf ("kkt\n");
}

for (int i=1; i<=M; i++)
    printf ("%d\n", ans[i]);

return 0;
}