Cod sursa(job #826201)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 30 noiembrie 2012 13:55:51
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

#define NMAX 3501

struct cutie {
	int x,y,z;
};

int c[NMAX][NMAX],l[NMAX],n;
cutie v[NMAX];

inline bool cmp(const cutie &a, const cutie &b)
{
	return a.x>b.x;
}

inline int LSB(int x)
{
	return x & (-x);
}

void update(int i, int j, int x)
{
	int k;
	for( ;i<=n;i=i+LSB(i))
		for(k=j;k<=n;k=k+LSB(k))
			c[i][k]=max(c[i][k],x);
}

void reset(int i, int j, int x)
{
	int k;
	for( ;i<=n;i=i+LSB(i))
		for(k=j;k<=n;k=k+LSB(k))
			c[i][k]=x;
}

int query(int i, int j)
 {
	int k,maxim;
	maxim=0;
	for( ;i>=1;i=i-LSB(i))
		for(k=j;k>=1;k=k-LSB(k))
			maxim=max(maxim,c[i][k]);
	return maxim;
 }
 
 int main ()
 {
	int i,k,t,maxim;
	ifstream f("cutii.in");
	ofstream g("cutii.out");
	f>>n>>t;
	for(k=1;k<=t;k++) {
		for(i=1;i<=n;i++)
			f>>v[i].x>>v[i].y>>v[i].z;
		sort(v+1,v+n+1,cmp);
		l[n]=1;
		update(v[n].y,v[n].z,1);
		for(i=n-1;i>=1;i--) {
			l[i]=query(v[i].y-1,v[i].z-1)+1;
			update(v[i].y,v[i].z,l[i]);
		}
		maxim=0;
		for(i=1;i<=n;i++) 
			if(l[i]>maxim)
				maxim=l[i];
		l[n]=0;
		reset(v[n].y,v[n].z,0);
		for(i=n-1;i>=1;i--) {
			l[i]=0;
			reset(v[i].y,v[i].z,l[i]);
		}
		g<<maxim<<'\n';
	}
	f.close();
	g.close();
	return 0;
 }