Cod sursa(job #1473441)

Utilizator ZenusTudor Costin Razvan Zenus Data 19 august 2015 13:49:25
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 300 + 10;
const int QMAX = 20000 + 10;

int i , j , c , N , Q , xx , xy , yx , yy , k , u , t;
int id[NMAX][NMAX] , blocked[NMAX][NMAX];
int dad[NMAX * NMAX];
vector < pair < pair < pair < int , int > , pair < int , int > > , int > > queries;
vector < pair < int , pair < int  , int > > > w;
int ans[QMAX];

int where(int x)
{
    int rang;

    rang = (dad[x] == x) ?  x : where(dad[x]);
    dad[x] = rang;

    return rang;
}

int main()
{

fin >> N >> Q;

for (i = 1 ; i <= N ; ++i)
for (j = 1 ; j <= N ; ++j)
{
    fin >> c;
    w.push_back({-c , {i , j}});

    id[i][j] = (i - 1) * N + j;
    dad[id[i][j]] = id[i][j];
    blocked[i][j] = true;
}

for (i = 1 ; i <= Q ; ++i)
{
    fin >> xx >> xy >> yx >> yy;
    queries.push_back({{{xx , xy} , {yx , yy}} , i});
}

sort(w.begin() , w.end());

for (k = 0 , u = 0 ; k < w.size() ; )
{
    c = -w[k].first;

    while (w[k].first == -c)
    {
        i = w[k].second.first;
        j = w[k].second.second;
        blocked[i][j] = false;

        if (blocked[i - 1][j] == false && i >= 2)
        dad[where(id[i - 1][j])] = dad[id[i][j]];

        if (blocked[i][j - 1] == false && j >= 2)
        dad[where(id[i][j - 1])] = dad[id[i][j]];

        if (blocked[i + 1][j] == false && i <= N - 1)
        dad[where(id[i + 1][j])] = dad[id[i][j]];

        if (blocked[i][j + 1] == false && j <= N - 1)
        dad[where(id[i][j + 1])] = dad[id[i][j]];

        k += 1;
    }

    for (t = u ; t < queries.size() ; ++t)
    if (where(id[queries[t].first.first.first][queries[t].first.first.second]) ==
        where(id[queries[t].first.second.first][queries[t].first.second.second]))
    {
        ans[queries[t].second] = c;
        swap(queries[t] , queries[u]);
        u += 1;
    }
}

for (i = 1 ; i <= Q ; ++i)
cout << ans[i] << '\n';

return 0;
}