Cod sursa(job #3184169)

Utilizator AswVwsACamburu Luca AswVwsA Data 14 decembrie 2023 17:36:20
Problema Matrice 2 Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define ll long long
using namespace std;

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

int v[NMAX + 1][NMAX + 1];
vector <pair <int, int> > poz[NMAX * NMAX + 1];

struct ob
{
    int i1, j1, i2, j2;
    int ans;
};

ob query[QMAX + 1];
int n;

bool active[NMAX + 1][NMAX + 1];
int viz[NMAX + 1][NMAX + 1];

vector <int> norm;
int cnt;
int normalize()
{
    int i, j;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            norm.push_back(v[i][j]);
    sort(norm.begin(), norm.end());
    norm.resize(unique(norm.begin(), norm.end()) - norm.begin());


    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
        {
            v[i][j] = lower_bound(norm.begin(), norm.end(), v[i][j]) - norm.begin();
            poz[v[i][j]].push_back({i, j});
        }
    return norm.size();
}

int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};

void dfs(int i, int j, int val)
{
    viz[i][j] = val;
    for (int k = 0; k < 4; k++)
    {
        int ni = i + di[k];
        int nj = j + dj[k];
        if (ni >= 1 and ni <= n and nj >= 1 and nj <= n and viz[ni][nj] == 0
            and active[ni][nj])
                dfs(ni, nj, val);
    }
}


void bs(int st, int dr, vector <int> &ceva)
{
    if (st > dr)
        return ;

    int i, med = ((st + dr) >> 1);
    /*if (med == 5)
        cout << "";*/
    vector <pair <int, int> > who;
    for (i = med; i <= cnt; i++)
    {
        for (pair <int, int> x : poz[i])
        {
            active[x.first][x.second] = 1;
            who.push_back(x);

        }
    }
    int aux = 0;
    for (pair <int, int> x : who)
        if (!viz[x.first][x.second])
        {
            aux++;
            dfs(x.first, x.second, aux);
        }
    vector <int> good, bad;
    for (int x : ceva)
        if (viz[query[x].i1][query[x].j1] == viz[query[x].i2][query[x].j2]
            and viz[query[x].i1][query[x].j1] != 0)
        {

            query[x].ans = norm[med];
            good.push_back(x);
        }
        else
            bad.push_back(x);
    for (i = med; i <= cnt; i++)
    {
        for (pair <int, int> x : poz[i])
        {
            active[x.first][x.second] = 0;
            viz[x.first][x.second] = 0;
        }
    }
    bs(st, med - 1, bad);
    bs(med + 1, dr, good);
}

signed main()
{
    ifstream cin("matrice2.in");
    ofstream cout("matrice2.out");
    int i, j, q;
    cin >> n >> q;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
        {
            cin >> v[i][j];
        }
    cnt = normalize();

    vector <int> qs;
    for (i = 1; i <= q; i++)
    {
        cin >> query[i].i1 >> query[i].j1 >> query[i].i2 >> query[i].j2;
        qs.push_back(i);
    }
    bs(0, cnt - 1, qs);
    for (i = 1; i <= q; i++)
        cout << query[i].ans << "\n";
}