Cod sursa(job #260059)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 februarie 2009 14:40:24
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define si short int
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair


typedef vector<int> VI;
typedef pair<si,si> pi;
typedef vector<string> VS;

#define IN  "cutii.in"
#define OUT "cutii.out"
#define N_MAX 3501
#define bit(x) ((x)&(x-1))^(x)//(((x)&((x)-1))^(x))


si N,T;
si B[N_MAX],A[N_MAX][N_MAX];

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%i%i\n",&N,&T);
}

II void update(si x,si y,si val)
{
	for(si i=x;i<=N;i += bit(i))
	for(si j=y;j<=N;j += bit(j))
		A[i][j] = max(A[i][j],val);
}

II si querry(si x,si y)
{
	si sum(0);
	for(si i=x;i>=1;i-= bit(i))
	for(si j=y;j>=1;j-= bit(j))
		sum = max(A[i][j],sum);
	return sum;
}

vector< pair<si,pi> > V;

II void solve()
{
	CC(A);CC(B);
	si rez(0);
	
	V.resize(N);
	FOR(i,1,N)
		scanf("%i%i%i\n",&V[i-1].f,&V[i-1].s.f,&V[i-1].s.s);
	sort(V.begin(),V.end() );
	
	FOR(i,1,N)
	{
		si x = V[i-1].s.f;
		si y = V[i-1].s.s;
		
		B[i] = querry(x,y) + 1;
		update(x,y,B[i]);
		
		rez = max(B[i],rez);
	}	
	
	printf("%d\n",rez);
}

int main()
{
	scan();
	for(++T;--T;solve());
	return 0;
}