Cod sursa(job #2097864)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 1 ianuarie 2018 19:22:48
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>
#define VAL 3505

using namespace std;

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

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

cutie C[VAL];

int N, T, i, j, ANS;
int aib[VAL][VAL], dp[VAL];

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

int zero(int X)
{
    return X & (-X);
}

void Rebuild(int L, int C)
{
    int i, j;
    for (i=L; i<=N; i+=zero(i))
      for (j=C; j<=N; j+=zero(j))
        aib[i][j]=0;
}

void Update(int L, int C, int X)
{
    int i, j;
    for (i=L; i<=N; i+=zero(i))
      for (j=C; j<=N; j+=zero(j))
        aib[i][j]=max(aib[i][j], X);
}

int Query(int L, int C)
{
    int mx=0, i, j;
    for (i=L; i>0; i-=zero(i))
      for (j=C; j>0; j-=zero(j))
        mx=max(mx, aib[i][j]);
    return mx;
}

int main()
{
    fin >> N >> T;
    while (T)
    {
        for (i=1; i<=N; i++)
          fin >> C[i].x >> C[i].y >> C[i].z;
        sort(C+1, C+N+1, cmp);
        ANS=0;
        for (i=1; i<=N; i++)
        {
            dp[i]=Query(C[i].y, C[i].z)+1;
            ANS=max(ANS, dp[i]);
            Update(C[i].y, C[i].z, dp[i]);
        }
        for (i=1; i<=N; i++)
          Rebuild(C[i].y, C[i].z);
        fout << ANS << '\n';
        T--;
    }
    fin.close();
    fout.close();
    return 0;
}