Cod sursa(job #2630042)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 23 iunie 2020 19:44:31
Problema Matrice 2 Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("matrice2.in");
ofstream cout("matrice2.out");

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

int N, Q;

bool active[NMAX + 2][NMAX + 2];
pair <short int, short int> dad[NMAX + 2][NMAX + 2];

vector < pair <int, pair<short int, short int>> > fields;

vector <short int> qr[NMAX + 2][NMAX + 2];
int ans[QMAX + 2];

pair <short int, short int> Root(pair <short int, short int> field)
{
    if(field == dad[field.first][field.second])
        return field;

    return dad[field.first][field.second] = Root(dad[field.first][field.second]);
}

void dojoin(pair <short int, short int> p, pair <short int, short int> q, int val)
{
    p = Root(p);
    q = Root(q);

    if(p == q)
        return;

    dad[p.first][p.second] = q;

    vector <short int> mergedVector;

    int pp = 0, qq = 0;
    while(pp < (int)qr[p.first][p.second].size() && qq < (int)qr[q.first][q.second].size())
    {
        if(qr[p.first][p.second][pp] == qr[q.first][q.second][qq])
            ans[qr[p.first][p.second][pp]] = val, pp++, qq++;
        else if(qr[p.first][p.second][pp] < qr[q.first][q.second][qq])
            mergedVector.push_back(qr[p.first][p.second][pp]), pp++;
        else
            mergedVector.push_back(qr[q.first][q.second][qq]), qq++;
    }

    while(pp < (int)qr[p.first][p.second].size())
        mergedVector.push_back(qr[p.first][p.second][pp]), pp++;

    while(qq < (int)qr[q.first][q.second].size())
        mergedVector.push_back(qr[q.first][q.second][qq]), qq++;

    qr[p.first][p.second].clear();
    qr[q.first][q.second] = mergedVector;
}

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
void join(pair <int, pair <short int, short int>> field)
{
    int val = field.first;
    short int x = field.second.first, y = field.second.second;
    active[x][y] = 1;

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

        if(1 <= xx && xx <= N && 1 <= yy && yy <= N && active[xx][yy])
            dojoin({x, y}, {xx, yy}, val);
    }
}

int main()
{
    cin >> N >> Q;

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
        {
            int x;
            cin >> x;
            active[i][j] = false;
            dad[i][j] = {i, j};
            fields.push_back({x, {i, j}});
        }

    for(int i = 1; i <= Q; i++)
    {
        int x, y, z, t;
        cin >> x >> y >> z >> t;
        qr[x][y].push_back(i);
        qr[z][t].push_back(i);
    }

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

    for(int i = fields.size() - 1; i >= 0; i--)
        join(fields[i]);

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

    return 0;
}