Cod sursa(job #1231819)

Utilizator ZenusTudor Costin Razvan Zenus Data 21 septembrie 2014 16:54:37
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <vector>
#include <set>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
#include <cstdio>
#include <climits>

#define PII pair < int , int >
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define LL long long
#define NMAX 3700
#define lst(x) ((x)&(-x))

using namespace std;

int aib[NMAX][NMAX];
pair < int , PII > C[NMAX];
int MAX,N,i,T,current;

void Update(PII X,int value)
{
    for (;X.F<=N;X.F+=lst(X.F))
    for (int j=X.S;j<=N;j+=lst(j))
    aib[X.F][j]=max(aib[X.F][j],value);
}

void Update_0(PII X)
{
    for (;X.F<=N;X.F+=lst(X.F))
    for (int j=X.S;j<=N;j+=lst(j))
    aib[X.F][j]=0;
}

int Query(PII X)
{
    int f=0;

    for (;X.F;X.F-=lst(X.F))
    for (int j=X.S;j;j-=lst(j))
    f=max(f,aib[X.F][j]);

    return f;
}

int main()
{
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);

scanf("%d%d",&N,&T);

while (T--)
{
    for (i=1;i<=N;++i)
    scanf("%d%d%d",&C[i].F,&C[i].S.F,&C[i].S.S);

    sort(C+1,C+N+1);

    for (i=1,MAX=0;i<=N;++i)
    {
        current=Query(C[i].S);

        Update(C[i].S,current+1);
        MAX=max(current+1,MAX);
    }

    for (i=1;i<=N;++i)
    Update_0(C[i].S);

    printf("%d\n",MAX);
}

return 0;
}