Cod sursa(job #2941325)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 17 noiembrie 2022 17:24:58
Problema Cutii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#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 =  3500;

#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;
}