Pagini recente » Borderou de evaluare (job #1893539) | Borderou de evaluare (job #1126592) | Borderou de evaluare (job #1304520) | Borderou de evaluare (job #950263) | Cod sursa (job #2941326)
#include <algorithm>
#include <fstream>
using namespace std;
ifstream cin( "cutii.in" );
ofstream cout( "cutii.out" );
struct Points {
int x, y, z;
void read() {
cin >> x >> y >> z;
}
};
const int MAX = 3511;
#define lsb(x) (x & (-x))
int aib[ MAX ][ MAX ], n;
void update( int x, int y, const 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 query( int x, int y ) {
int val = 0;
for( int i = x; i > 0; i -= lsb( i ) )
for( int j = y; j > 0; j -= lsb( j ) )
val = max( aib[ i ][ j ], val );
return val;
}
void reset( int x, int y ) {
int val = 0;
for( int i = x; i <= n; i += lsb( i ) )
for( int j = y; j <= n; j += lsb( j ) )
aib[ i ][ j ] = 0;
}
Points point[ MAX + 1 ];
int q;
int main()
{
cin >> n >> q;
while( q-- ) {
for( int i = 0; i < n; i++ )
point[ i ].read();
sort( point, point + n, []( const Points& A, const Points& B ) {
return A.x < B.x;
} );
int no = 1;
for( int i = 0; i < n; i++ ) {
int val = query( point[ i ].y, point[ i ].z ) + 1;
no = max( no, val );
update( point[ i ].y, point[ i ].z, val );
}
cout << no << '\n';
for( int i = 0; i < n; i++ )
reset( point[ i ].y, point[ i ].z );
}
return 0;
}