Pagini recente » Cod sursa (job #1891109) | Cod sursa (job #1916505) | Cod sursa (job #1064074) | Cod sursa (job #645170) | Cod sursa (job #1014379)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
const int Nmax = 3505;
struct boxs
{
int x;
int y;
int z;
bool operator < ( const boxs &a ) const
{
return this->z < a.z;
}
} box[Nmax];
int T, N;
int BIT[Nmax][Nmax];
inline int lsb( int x )
{
return ( x & ( -x ) );
}
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 ) )
BIT[i][j] = max( BIT[i][j], val );
}
int query( int x, int y )
{
int s = 0;
for ( int i = x; i >= 1; i -= lsb( i ) )
for ( int j = y; j >= 1; j -= lsb( j ) )
s = max ( BIT[i][j], s );
return s;
}
void erase_bit( int x, int y )
{
for ( int i = x; i <= N; i += lsb( i ) )
for ( int j = y; j <= N; j += lsb( j ) )
BIT[i][j] = 0;
}
int main()
{
ifstream f("cutii.in");
ofstream g("cutii.out");
f >> N >> T;
for ( int t = 1; t <= T; ++t )
{
for ( int i = 1; i <= N; ++i )
f >> box[i].x >> box[i].y >> box[i].z;
sort( box + 1, box + 1 + N );
int sol = 0;
for ( int i = 1; i <= N; ++i )
{
int state = query( box[i].x - 1, box[i].y - 1 ) + 1;
update( box[i].x, box[i].y, state );
sol = max ( state, sol );
}
for ( int i = 1; i <= N; ++i )
{
erase_bit( box[i].x, box[i].y );
}
g << sol << "\n";
}
return 0;
}