Cod sursa(job #2636786)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 19 iulie 2020 22:38:05
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 3500;
struct cutii
{
    int x , y , z;
    cutii(int tx = 0 , int ty = 0 , int tz = 0)
    {
        x = tx;
        y = ty;
        z = tz;
    }
};
cutii s[NMAX + 5];
int cmp(const cutii a , const cutii b)
{
    return a.x < b.x;
}
int aib[NMAX + 5][NMAX + 5] , n;
int query(int x , int y)
{
    int i , j , lg = 0;
    for(i = x ; i > 0 ; i = i - (i & (-i)))
        for(j = y ; j > 0 ; j = j - (j & (-j)))
            lg = max(lg , aib[i][j]);
    return lg;
}
void update(int x , int y , int val)
{
    int i , j;
    for(i = x ; i <= n ; i = i + (i & (-i)))
        for(j = y ; j <= n; j = j + (j & (-j)))
            aib[i][j] = max(aib[i][j] , val);
}
int main()
{
    freopen("cutii.in" , "r" , stdin);
    freopen("cutii.out" , "w" , stdout);
    int t , i , k , aux , maxim , x , y , z , j , l;
    scanf("%d%d" , &n , &t);
    for(k = 1 ; k <= t ; k ++)
    {
        for(i = 1 ; i <= n ; i ++)
        {
            scanf("%d%d%d" , &x , &y , &z);
            s[i] = cutii(x , y , z);
        }
        sort(s + 1 , s + n + 1 , cmp);
        memset(aib , 0 , sizeof(aib));
        maxim = 0;
        for(i = 1 ; i <= n ; i ++)
        {
            aux = query(s[i].y , s[i].z) + 1;
            maxim = max(maxim , aux);
            update(s[i].y , s[i].z , aux);
        }
        printf("%d\n" , maxim);
    }
    return 0;
}