Cod sursa(job #1403844)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 27 martie 2015 16:49:09
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include<cstdio>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<bitset>
#include<deque>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<unordered_map>

#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second

using namespace std;

const int nmax = 305;
const int qmax = 20005;

int n, m, i, j, cnt, step, N, p;
int a[nmax][nmax], code[nmax][nmax];
int f[nmax * nmax], sol[qmax];
bool viz[nmax][nmax];

int dx[] = { -1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};

struct elem
{
    int x, y, val;

    bool operator < (const elem &A) const
    {
        return val > A.val;
    }
};
elem e[nmax*nmax];

struct query
{
    int x1, y1, x2, y2, i, sol;

    bool operator < (const query &A) const
    {
        return sol > A.sol;
    }
};
query q[qmax];

int find(int x)
{
    if(f[x] != x)
        f[x] = find(f[x]);
    return f[x];
}

void unite(int x, int y)
{
    f[x] = y;
}

void unite_4d(int x, int y)
{
    int F = find(code[x][y]);

    for(int k = 0; k < 4; k++)
    {
        int newx = x + dx[k];
        int newy = y + dy[k];

        if(viz[newx][newy])
            unite(find(code[newx][newy]), F);
    }
}

int main()
{
    freopen("matrice2.in", "r", stdin);
    freopen("matrice2.out", "w", stdout);

    scanf("%d%d", &n, &m);

    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
        {
            scanf("%d", &a[i][j]);

            ++cnt;
            e[cnt].x = i;
            e[cnt].y = j;
            e[cnt].val = a[i][j];

            code[i][j] = cnt;
        }

    N = n * n;

    for(i = 1; i <= m; i++)
    {
        scanf("%d%d", &q[i].x1, &q[i].y1);
        scanf("%d%d", &q[i].x2, &q[i].y2);
        q[i].i = i;
    }

    sort(e + 1, e + N + 1);

    for(step = 1 << 19; step; step >>= 1)
    {
        memset(viz, 0, sizeof(viz));

        for(i = 1; i <= N; i++)
            f[i] = i;

        sort(q + 1, q + m + 1);

        p = 1;
        for(i = 1; i <= m; i++)
        {
            while(p <= N && e[p].val >= q[i].sol + step)
            {
                viz[e[p].x][e[p].y] = 1;
                unite_4d(e[p].x, e[p].y);
                p++;
            }

            int F = find(code[q[i].x1][q[i].y1]);
            int G = find(code[q[i].x2][q[i].y2]);

            if(F == G)
                q[i].sol += step;
        }
    }

    for(i = 1; i <= m; i++)
        sol[q[i].i] = q[i].sol;

    for(i = 1; i <= m; i++)
        printf("%d\n", sol[i]);

    return 0;
}