Cod sursa(job #2150825)

Utilizator FredyLup Lucia Fredy Data 3 martie 2018 20:00:51
Problema Cutii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

#define lim 3510
int n,t,sol,lmax;
int aib[lim][lim];
struct cutie {int x,y,z;} ini[lim];

bool cmp (cutie A, cutie B)
{
    return A.x<B.x;
}

int query (int i, int j)
{
    int maxm=-1000000;
    for (int l=i; l>0; l-=(l&(-l)))
        for (int c=j; c>0; c-=(c&(-c)))
            maxm = max (maxm, aib[l][c]);
    return maxm;
}

void update (int i, int j, int val)
{
    for (int l=i; l<=n; l+=(l&(-l)))
        for (int c=j; c<=n; c+=(c&(-c)))
            aib[l][c] = val;
}

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

        sol = -1000000000;
        for (int i=1; i<=n; i++)
        {
            lmax = query (ini[i].y, ini[i].z) + 1;
            update (ini[i].y, ini[i].z, lmax);
            sol = max (sol, lmax);
        }

        fout<<sol<<'\n';

        for (int i=1; i<=n; i++)
            for (int j=ini[i].y; j<=n; j+=(j&(-j)))
                for (int k=ini[i].z; k<=n; k+=(k&(-k)))
                    aib[j][k] = 0;
    }

    fout.close();
    return 0;
}