Cod sursa(job #1264540)

Utilizator felixiPuscasu Felix felixi Data 15 noiembrie 2014 21:50:59
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <algorithm>
#include <fstream>

using namespace std;

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

const int NMAX = 3500;

struct CUTIE {
    int x,y,z;
};

bool cmp_cutie( CUTIE A, CUTIE B ) {
    return A.z < B.z;
}

inline int LSB( int &nr ) {
    return ( nr & (-nr) );
}

CUTIE v[NMAX+2];
int aib[NMAX+2][NMAX+2];
int d[NMAX+2];
int T,N;

void Reset() {
    for( int i= 1;  i<=N;  ++i ) {
        for( int x= v[i].x;  x<=N;  x+= LSB(x) ) {
            for( int y= v[i].y;  y<=N;  y+= LSB(y) )  aib[x][y]= 0;
        }
    }
}

int Querry( int x, int y ) {
    int ans= 0;
    for( int i= x;  i>0;  i-= LSB(i) ) {
        for( int j= y;  j>0;  j-= LSB(j) ) ans= max( aib[i][j], ans );
    }
    return ans;
}

void Update( int x, int y, 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 Solve() {
    int R= 0;
    for( int i= 1;  i<=N;  ++i ) {
        d[i]= Querry( v[i].x, v[i].y ) + 1;
        Update( v[i].x, v[i].y, d[i] );
        R= max( R, d[i] );
    }
    return R;
}

int main() {
    in >> N >> T;
    for( int t= 0;  t<T;  ++t ) {
        for( int i= 1;  i<=N;  ++i )  in >> v[i].z >> v[i].x >> v[i].y;

        sort( v+1, v+N+1, cmp_cutie );

        out << Solve() << '\n';

        Reset();
    }
    return 0;
}