Cod sursa(job #1781911)

Utilizator preda.andreiPreda Andrei preda.andrei Data 17 octombrie 2016 16:44:23
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <algorithm>
#include <fstream>
#include <tuple>
#include <vector>

#include <iostream>

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);
	}
}

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

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

	while (t--) {
		vector<Cutie> cutii(n);
		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());

		AIB aib(n + 1, vector<int>(n + 1, 0));
		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";
	}

	return 0;
}