Cod sursa(job #1781952)

Utilizator preda.andreiPreda Andrei preda.andrei Data 17 octombrie 2016 17:35:39
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <algorithm>
#include <fstream>
#include <tuple>
#include <vector>

using namespace std;

typedef tuple<int, int, int> Cutie;
typedef vector<vector<int>> AIB;

inline int PutereZerouri(int x)
{
	return (x ^ (x - 1)) & x;
}

int GasesteMax(const AIB &aib, int x, int y)
{
	int maxim = 0;
	while (x > 0) {
		int cy = y;
		while (cy > 0) {
			maxim = max(maxim, aib[x][cy]);
			cy -= PutereZerouri(cy);
		}
		x -= PutereZerouri(x);
	}
	return maxim;
}

void Actualizeaza(AIB &aib, int x, int y, int val)
{
	while (x < aib.size()) {
		int cy = y;
		while (cy < aib[0].size()) {
			aib[x][cy] = max(aib[x][cy], val);
			cy += PutereZerouri(cy);
		}
		x += PutereZerouri(x);
	}
}

void Curata(AIB &aib, int x, int y)
{
	while (x < aib.size()) {
		int cy = y;
		while (cy < aib[0].size()) {
			aib[x][y] = 0;
			cy += PutereZerouri(cy);
		}
		x += PutereZerouri(x);
	}
}

int main()
{
	ifstream fin("cutii.in");
	ofstream fout("cutii.out");

	int n, t;
	fin >> n >> t;

	vector<Cutie> cutii(n);
	AIB aib(n + 1, vector<int>(n + 1, 0));
	while (t--) {
		for (int i = 0; i < n; ++i)
			fin >> get<0>(cutii[i]) >> get<1>(cutii[i]) >> get<2>(cutii[i]);
		sort(cutii.begin(), cutii.end());

		int maxim = 0;
		for (auto &cutie : cutii) {
			int lmax = GasesteMax(aib, get<1>(cutie) - 1, get<2>(cutie) - 1);
			Actualizeaza(aib, get<1>(cutie), get<2>(cutie), lmax + 1);
			maxim = max(maxim, lmax + 1);
		}
		fout << maxim << "\n";

		if (t > 0) {
			for (auto &cutie : cutii)
				Curata(aib, get<1>(cutie), get<2>(cutie));
		}
	}

	return 0;
}