Cod sursa(job #1976552)

Utilizator robx12lnLinca Robert robx12ln Data 3 mai 2017 17:44:15
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define X first
#define Y second.first
#define Z second.second
using namespace std;
FILE * fin = fopen("cutii.in","r");
FILE * fout = fopen("cutii.out","w");
int n, T, sol;
int aib[3505][3505];
pair< int, pair<int,int> > v[3505];
vector< pair< int, pair<int,int> > > updates;
void upd( int I, int J, int x ){
    for( int i = I; i <= n; i += ( i & (-i) ) )
        for( int j = J; j <= n; j += ( j & (-j) ) )
            aib[i][j] = max( aib[i][j], x );
    return;
}
int query( int I, int J ){
    int maxim = 0;
    for( int i = I; i >= 1; i -= ( i & (-i) ) )
        for( int j = J; j >= 1; j -= ( j & (-j) ) )
            maxim = max( aib[i][j], maxim );
    return maxim;
}
void reset( int I, int J ){
    for( int i = I; i <= n; i += ( i & (-i) ) )
        for( int j = J; j <= n; j += ( j & (-j) ) )
            aib[i][j] = 0;
    return;
}
int main(){
    fscanf( fin, "%d%d", &n, &T );
    for( int t = 1; t <= T; t++ ){
        for( int i = 1; i <= n; i++ ){
            fscanf( fin, "%d%d%d", &v[i].X, &v[i].Y, &v[i].Z );
        }
        sort( v + 1, v + n + 1 );
        sol = 0;
        for( int i = 1; i <= n; i++ ){
            if( v[i].X != v[i - 1].X ){
                while( !updates.empty() ){
                    upd( updates.back().X, updates.back().Y, updates.back().Z );
                    updates.pop_back();
                }
            }
            int val = query( v[i].Y - 1, v[i].Z - 1 ) + 1;
            updates.push_back( make_pair( v[i].Y, make_pair( v[i].Z, val ) ) );
            sol = max( sol, val );
        }
        updates.clear();
        for( int i = 1; i <= n; i++ ){
            reset( v[i].Y, v[i].Z );
        }
        fprintf( fout, "%d\n", sol );
    }
    return 0;
}