Cod sursa(job #1041847)

Utilizator tudorv96Tudor Varan tudorv96 Data 26 noiembrie 2013 11:37:02
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const int N = 3505;

int aib[N][N], sol, n, t;
pair <int, pair <int, int> > v[N];

void update (int x, int y, int s) {
	for (int i = x; i <= n; i += (i & -i))
		for (int j = y; j <= n; j += (j & -j))
			aib[i][j] = max (aib[i][j], s);
}

void clear(int x, int y) {
	for (int i = x; i <= n; i += (i & -i))
		for (int j = y; j <= n; j += (j & - j))
			aib[i][j] = 0;
}

int query (int x, int y) {
	int sol = 0;
	for (int i = x; i; i -= (i & -i))
		for (int j = y; j; j -= (j & -j))
			sol = max (sol, aib[i][j]);
	return sol;
}

int main() {
	fin >> n >> t;
	while (t--) {
		sol = 0;
		for (int i = 1; i <= n; ++i)
			fin >> v[i].first >> v[i].second.first >> v[i].second.second;
		sort (v + 1, v + n + 1);
		for (int i = 1; i <= n; ++i) {
			int x = v[i].second.first, y = v[i].second.second;
			int s = query (x - 1, y - 1) + 1;
			sol = max (s, sol);
			update (x, y, s);
		}
		for (int i = 1; i <= n; ++i)
			clear(v[i].second.first, v[i].second.second);
		fout << sol << "\n";
	}
}