Cod sursa(job #1792224)

Utilizator borcanirobertBorcani Robert borcanirobert Data 30 octombrie 2016 11:10:37
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;

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

const int MAXN = 3510;
struct Paralelipiped{
    int x, y, z;
};
int N, T;
Paralelipiped a[MAXN];
int aib[MAXN][MAXN];
int D[MAXN];
int rez;

void Update( int x, int y, int val );
int Query( int x, int y );
void Sterge( int x, int y );

bool Comp( const Paralelipiped& a, const Paralelipiped& b )
{
    return a.x < b.x || ( a.x == b.x && a.y < b.y ) || ( a.x == b.x && a.y == b.y && a.z < b.z );
}

int main()
{
    int i, j;

    fin >> N >> T;
    while ( T-- )
    {
        for ( i = 1; i <= N; i++ )
            fin >> a[i].x >> a[i].y >> a[i].z;

        sort( a + 1, a + 1 + N, Comp );

        D[1] = rez = 1;
        Update(a[1].y, a[1].z, 1);
        for ( i = 2; i <= N; i++ )
        {
            D[i] = Query(a[i].y, a[i].z) + 1;
            rez = max( rez, D[i] );

            Update(a[i].y, a[i].z, D[i]);
        }

        fout << rez << '\n';

        for ( i = 1; i <= N; i++ )
        {
            Sterge(a[i].y, a[i].z);
        }

     //   memset(aib, 0, sizeof(aib));
    }

    fin.close();
    fout.close();
    return 0;
}

void Update( int x, int y, int val )
{
    int i, j;

    for ( i = x; i <= N; i += i & -i )
        for ( j = y; j <= N; j += j & -j )
            aib[i][j] = max( aib[i][j], val );
}

int Query( int x, int y )
{
    int maxim = 0;

    for ( int i = x; i >= 1; i -= i & -i )
        for ( int j = y; j >= 1; j -= j & -j )
            maxim = max( maxim, aib[i][j] );

    return maxim;
}

void Sterge( int x, int y )
{
    int i, j;

    for ( i = x; i <= N; i += i & -i )
        for ( j = y; j <= N; j += j & -j )
            aib[i][j] = 0;
}