Cod sursa(job #1014379)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 22 octombrie 2013 16:37:43
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;

const int Nmax = 3505;

struct boxs
{
    int x;
    int y;
    int z;

    bool operator < ( const boxs &a ) const
    {
        return this->z < a.z;
    }

} box[Nmax];

int T, N;
int BIT[Nmax][Nmax];

inline int lsb( int x )
{
    return ( x & ( -x ) );
}

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 ) )
                    BIT[i][j] = max( BIT[i][j], val );
}

int query( int x, int y )
{
    int s = 0;

    for ( int i = x; i >= 1; i -= lsb( i ) )
            for ( int j = y; j >= 1; j -= lsb( j ) )
                    s = max ( BIT[i][j], s );

    return s;
}

void erase_bit( int x, int y )
{
    for ( int i = x; i <= N; i += lsb( i ) )
            for ( int j = y; j <= N; j += lsb( j ) )
                    BIT[i][j] = 0;
}

int main()
{
    ifstream f("cutii.in");
    ofstream g("cutii.out");

    f >> N >> T;

    for ( int t = 1; t <= T; ++t )
    {
        for ( int i = 1; i <= N; ++i )
                f >> box[i].x >> box[i].y >> box[i].z;

        sort( box + 1, box + 1 + N );

        int sol = 0;

        for ( int i = 1; i <= N; ++i )
        {
            int state = query( box[i].x - 1, box[i].y - 1 ) + 1;

            update( box[i].x, box[i].y, state );
            sol = max ( state, sol );
        }

        for ( int i = 1; i <= N; ++i )
        {
            erase_bit( box[i].x, box[i].y );

        }

        g << sol << "\n";
    }

    return 0;
}