Pagini recente » Cod sursa (job #489582) | Cod sursa (job #2753483) | Cod sursa (job #885300) | Cod sursa (job #2889732) | Cod sursa (job #1335190)
#include <algorithm>
#include <fstream>
using namespace std;
const int NMAX= 3500;
ifstream in( "cutii.in" );
ofstream out( "cutii.out" );
struct box
{
int x, y, z;
};
inline int LSB( int &nr )
{
return ( nr&(-nr) );
}
bool cmp( box A, box B )
{
return A.z < B.z;
}
box v[NMAX+1];
int aib[NMAX+1][NMAX+1], d[NMAX+1];
int N;
void Reset()
{
for( int i= 1; i<=N; ++i )
{
for( int x= v[i].x; x<=N; x+= LSB(x) )
{
for( int y= v[i].y; y<=N; y+= LSB(y) )
{
aib[x][y]= 0;
}
}
}
}
int Querry( int x, int y )
{
int ans= 0;
for( int i= x; i>0; i-= LSB(i) )
{
for( int j= y; j>0; j-= LSB(j) )
{
ans= max( aib[i][j], ans );
}
}
return ans;
}
void Update( int x, int y, int val )
{
for( int i= x; i<=N; i+= LSB(i) )
{
for( int j= y; j<=N; j+= LSB(j) )
{
aib[i][j]= max( aib[i][j], val );
}
}
}
int Solve()
{
int R= 0;
for( int i= 1; i<=N; ++i )
{
d[i]= Querry( v[i].x, v[i].y ) + 1;
Update( v[i].x, v[i].y, d[i] );
R= max( R, d[i] );
}
return R;
}
int main()
{
int T;
in >> N >> T;
for( int t= 0; t<T; ++t )
{
for( int i= 1; i<=N; ++i )
{
in >> v[i].z >> v[i].x >> v[i].y;
}
sort( v+1, v+N+1, cmp );
out << Solve() << '\n';
Reset();
}
return 0;
}