Cod sursa(job #565389)

Utilizator pykhNeagoe Alexandru pykh Data 27 martie 2011 18:35:17
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const char in[]="cutii.in";
const char out[]="cutii.out";

const int Max_N = 3505;

int N, T, aib[Max_N][Max_N];

struct cutie{ int x, y, z; } v[Max_N];

inline int bit(int a){return a^(a & (a-1));}

struct cmp{
	bool operator()(const cutie &a,const cutie &b)
	{
		return a.x < b.x;
	}
};

inline int maxim(int a, int b){	return a > b ? a : b ; }

void update(int a, int b, int val)
	{int i, j;
		for(i = a ; i <= N ; i += bit(i))
			for(j = b ; j <= N ; j += bit(j))
				aib[ i ][ j ] = maxim(aib[ i ][ j ], val);
}

int query(int a, int b)
{int sol = 0, i, j;
	for(i = a ; i >= 1 ; i -= bit(i))
		for(j = b ; j >= 1 ; j -= bit(j))
			sol = max(sol, aib[i][j]);
	return sol;
}

int solve()
	{int a, sol = 0;
		for(int i =1 ; i <= N ; ++i)
		{
			a = query(v[i].y, v[i].z) + 1;
			update(v[i].y, v[i].z, a);
			sol = maxim(sol, a);
		}
		return sol;
	}
	
int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		scanf("%d%d", &N, &T);
		
		while(T--)
		{
			memset(aib, 0, sizeof(aib));
			for(int i = 1 ; i <= N ; ++i)
				scanf("%d%d%d", &v[i].x, &v[i].y, &v[i].z);
			sort(v + 1 ,v + N + 1 , cmp());
			printf("%d\n", solve());
		}
		return 0;
}