Cod sursa(job #2757982)

Utilizator Tudor06MusatTudor Tudor06 Data 7 iunie 2021 20:59:42
Problema Cutii Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 3500;

static inline int zeros( int x ) {
    return x & -x;
}
int aib[NMAX + 1][NMAX + 1];

void update( int i, int j, int x, int n ) {
    for ( int a = i; a <= n; a += zeros( a ) ) {
        for ( int b = j; b <= n; b += zeros( b ) ) {
            aib[a][b] = max( aib[a][b], x );
        }
    }
}
int query( int i, int j ) {
    int res = 0;
    for ( int a = i; a > 0; a -= zeros( a ) ) {
        for ( int b = j; b > 0; b -= zeros( b ) )
            res = max( res, aib[a][b] );
    }
    return res;
}
void reset( int n ) {
    for ( int i = 1; i <= n; i += zeros( i ) ) {
        for ( int j = 1; j <= n; j += zeros( j ) ) {
            aib[i][j] = 0;
        }
    }
}

struct cutie {
    int x;
    int y;
    int z;
} v[NMAX];
int ans[NMAX];

bool cmp( cutie a, cutie b ) {
    if ( a.x < b.x )
        return 1;
    if ( a.x == b.x ) {
        return a.y > b.y;
    }
    return 0;
}
int main() {
    ifstream fin( "cutii.in" );
    ofstream fout( "cutii.out" );
    int t, n, i, maxim;
    fin >> n >> t;
    while ( t-- ) {
        for ( i = 0; i < n; i ++ ) {
            fin >> v[i].x >> v[i].y >> v[i].z;
        }
        sort( v, v + n, cmp );
        maxim = 0;
        for ( i = 0; i < n; i ++ ) {

            ans[i] = query( v[i].y - 1, v[i].z - 1 ) + 1;
            update( v[i].y, v[i].z, ans[i], n );
            maxim = max( maxim, ans[i] );
        }
        fout << maxim << '\n';
        reset( n );
    }
    return 0;
}