Cod sursa(job #1425501)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 27 aprilie 2015 16:12:45
Problema Cutii Scor 100
Compilator cpp Status done
Runda pregatire-lot-aib Marime 1.57 kb
#include<fstream>
#include<algorithm>

using namespace std;

ifstream fin( "cutii.in" );
ofstream fout( "cutii.out" );

const int nmax = 3500;
int sol, n, aib[ nmax + 1 ][ nmax + 1 ];
struct str{ int x, y, z; } v[ nmax + 1 ];

bool cmp( str a, str b ) {
    return (a.x < b.x);
}
inline int max2( int a, int b ) {
    if ( a < b ) {
        return b;
    } else {
        return a;
    }
}
inline int lsb( int x ) {
    return ( x & -x );
}
void init() {
    for( int k = 0; k < n; ++ k ) {
        for( int i = v[ k ].y; i <= n; i += lsb( i ) ) {
            for( int j = v[ k ].z; j <= n; j += lsb( j ) ) {
                aib[ i ][ j ] = 0;
            }
        }
    }
}
int query( int y, int z ) {
    int ans = 0;
    for( int i = y - 1; i > 0; i -= lsb( i ) ) {
        for( int j = z - 1; j > 0; j -= lsb( j ) ) {
            ans = max2( ans, aib[ i ][ j ] );
        }
    }
    return ans;
}
void update( int y, int z, int val ) {
    for( int i = y; i <= n; i += lsb( i ) ) {
        for( int j = z; j <= n; j += lsb( j ) ) {
            aib[ i ][ j ] = max2( aib[ i ][ j ], val );
        }
    }
}
int main() {
    int t, k;
    fin >> n >> t;
    while ( t -- ) {
        for( int i = 0; i < n; ++ i ) {
            fin >> v[ i ].x >> v[ i ].y >> v[ i ].z;
        }
        sort( v, v + n, cmp );
        sol = 0;
        for( int i = 0; i < n; ++ i ) {
            k = query( v[ i ].y, v[ i ].z ) + 1;
            sol = max2( sol, k );
            update( v[ i ].y, v[ i ].z, k );
        }
        fout << sol << "\n";

        init();
    }
    fin.close();
    fout.close();
    return 0;
}