Cod sursa(job #1334299)

Utilizator gedicaAlpaca Gedit gedica Data 4 februarie 2015 10:43:09
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <algorithm>
#include <fstream>

using namespace std;

const int NMAX= 3500;

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

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

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

bool cmp( box A, box B )
{
    return A.z < B.z;
}

box v[NMAX+1];
int aib[NMAX+1][NMAX+1], d[NMAX+1];
int 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()
{
    int T;

    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 );

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

        Reset();
    }
    return 0;
}