Cod sursa(job #1107800)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 14 februarie 2014 12:02:53
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <algorithm>
#include <iostream>
#include <fstream>
using namespace std;

const int oo = 0x3f3f3f3f;
int aib[3505][3505];

struct triplu {
	int a, b, c;
};
int N, T;
triplu A[3505];

inline void add(const int &I, const int &J, const int &value) {
	for (int i = I; i <= N; i = (i | (i - 1)) + 1)
		for (int j = J; j <= N; j = (j | (j - 1)) + 1)
			if (value)
				aib[i][j] = max(aib[i][j], value);
			else
				aib[i][j] = value;
}

inline int query(const int &I, const int &J) {
	int res = 0;
	for (int i = I - 1; i >= 1; i = i & (i - 1))
		for (int j = J - 1; j >= 1; j = j & (j - 1))
			res = max(res, aib[i][j]);
	return res;
}

void solve() {
	int res = 0;
	
	for (int i = 1; i <= N; ++i) {
		scanf("%d%d%d", &A[i].a, &A[i].b, &A[i].c);
	}
	sort(A + 1, A + N + 1,
		[&] (const triplu &A, const triplu &B) {
			return A.a < B.a;
		}
	);
	
	for (int i = 1; i <= N; ++i) {
		int foo = query(A[i].b, A[i].c) + 1;
		res = max(res, foo);
		add(A[i].b, A[i].c, foo);
	}
	
	for (int i = 1; i <= N; ++i) {
		add(A[i].b, A[i].c, 0);
	}
	
	printf("%d\n", res);
}

int main() {
#ifdef INFOARENA
	freopen("cutii.in", "r", stdin);
	freopen("cutii.out", "w", stdout);
#endif
	
	scanf("%d%d", &N, &T);
	for (int i = 1; i <= T; ++i) {
		solve();
	}
}