Cod sursa(job #2470584)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 9 octombrie 2019 15:20:25
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")

#include <bits/stdc++.h>

using namespace std;

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

#define lsb(x) (x&(-x))

static const int NMAX = 3505;

int aib[NMAX][NMAX];
int dp[NMAX];
int n;

struct sizes
{
    int x, y,z;
};
sizes box[NMAX];

inline bool cmp(const sizes &a, const sizes &b)
{
    return a.x < b.x;
}

int query(int y, int z)
{
    int mx = 0;
    for(int i = y; i >= 1; i-=lsb(i))
    {
        for(int j = z; j >= 1; j-=lsb(j))
        {
            mx = max(mx,aib[i][j]);
        }
    }
    return mx;
}

void update(int y,int z, int value)
{
    for(int i =y; i <=n; i+=lsb(i))
    {
        for(int j = z; j <= n; j+=lsb(j))
        {
            aib[i][j] = max(aib[i][j], value);
        }
    }
}

void setAIB()
{
    int l, i, j;
    for(l = 1; l <=n; ++l)
    {
        for(i = box[l].y ; i <= n; i+=lsb(i))
        {
            for(j = box[l].z ; j <= n; j+=lsb(j))
                aib[i][j] = 0;
        }
    }
}


int main()
{
    int t;
    fin>> n >> t;

    while(t--)
    {
        for(int i =1 ; i<= n; ++i)
        {
            fin >> box[i].x >> box[i].y >> box[i].z;
        }
        sort(box+1, box+n+1,cmp);
        

        for(int i = 1; i<=n; ++i)
        {
            dp[i] = query(box[i].y-1, box[i].z-1) + 1;
            update(box[i].y, box[i].z, dp[i]);
        }

        int sol = 0;
        for(int i = 1; i<=n; ++i)
        {
            sol = max(sol,dp[i]);
        }
        fout << sol << '\n';

        setAIB();
    }


    return 0;
}