Cod sursa(job #2715922)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 4 martie 2021 13:18:28
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda simularedelacasi1 Marime 2.64 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <functional>

using namespace std;

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

const int NMAX = 305;
const int VMAX = 1000005;

struct cell {
	int x, y;
};

vector<cell>v[VMAX];
bool f[VMAX];
int a[NMAX][NMAX];
int ca[NMAX][NMAX];
bool viz[NMAX][NMAX];
int x[NMAX][NMAX];
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
vector<int>sortedVals;

int n, q, k;

void read()
{
	fin >> n >> q;
	for(int i = 1;  i <= n ; i++)
		for (int j = 1; j <= n; j++)
		{
			fin >> a[i][j];
			ca[i][j] = a[i][j];
			v[a[i][j]].push_back(cell({ i, j }));
			if (f[a[i][j]] == 0)
				f[a[i][j]] = 1, sortedVals.push_back(a[i][j]);
		}
	sort(sortedVals.begin(), sortedVals.end(),greater<int>());
	k = sortedVals.size();
}

inline void add(int value)
{
	for (int i = 0; i < v[value].size(); i++)
	{
		cell temp = v[value][i];
		x[temp.x][temp.y] = 1;
	}
}

void FIL(int xx, int yy)
{
	viz[xx][yy] = true;
	for (int i = 0; i < 4; i++)
	{
		int xi = xx + dx[i];
		int yi = yy + dy[i];
		if (!(xi >= 1 && xi <= n && yi >= 1 && yi <= n)) continue;
		if (!viz[xi][yi] && x[xi][yi] == 1)
			FIL(xi, yi);
	}
}

bool isOk(int xi, int yi, int xf, int yf)
{
	if (x[xi][yi] == 0 || x[xf][yf] == 0) return false;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			viz[i][j] = false;
	FIL(xi, yi);
	return viz[xf][yf];
}

bool verif(int med,int start,int xi,int yi,int xf,int yf)
{
	int ending;
	for (int i = start ; i < k; i++)
	{
		if (sortedVals[i] == med)
		{
			ending = i;
			break;
		}
	}
	for (int i = start + 1; i <= ending; i++)
		add(sortedVals[i]);

	return isOk(xi,yi,xf,yf);
}

int query(int& xi, int& yi, int& xf, int& yf)
{
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			x[i][j] = 0;

	int mi = min(a[xi][yi], a[xf][yf]);
	int start;
	for (int i = 0 ; i < k; i++)
	{
		if (sortedVals[i] == mi)
		{
			start = i;
			break;
		}
	}

	for (int i = 0; i <= start ; i++)
		add(sortedVals[i]);

	int st = sortedVals.back();
	int dr = mi;
	int med;
	int ans = -1;
	while (st <= dr)
	{
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				x[i][j] = 0;
		for (int i = 0; i <= start; i++)
			add(sortedVals[i]);
		int med = (st + dr) / 2;
		if (verif(med,start,xi,yi,xf,yf))
		{
			ans = med;
			st = med + 1;
		}
		else
			dr = med - 1;
	}
	return ans;
}

void solve()
{
	while (q--)
	{
		int xi, yi, xf, yf;
		fin >> xi >> yi >> xf >> yf;
		fout << query(xi, yi, xf, yf) << '\n';
	}
}

int main()
{
	read();
	solve();
	return 0;
}