Cod sursa(job #1033287)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 16 noiembrie 2013 18:13:29
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX = 3505;
int N,T,i,A,B,S,SOL,AIB[NMAX][NMAX];
struct Cutie {int X,Y,Z;} C[NMAX];
bool cmp(Cutie A,Cutie B) {return A.X<B.X;}
int Query(int A,int B)
{
    int R=0;
    for(int i=A;i;i-=i&(-i))
        for(int j=B;j;j-=j&(-j))
            R=max(R,AIB[i][j]);
    return R;
}
void Update(int A,int B,int V)
{
    for(int i=A;i<=N;i+=i&(-i))
        for(int j=B;j<=N;j+=j&(-j))
            AIB[i][j]=max(AIB[i][j],V);
}
void Clear(int A,int B)
{
    for(int i=A;i<=N;i+=i&(-i))
        for(int j=B;j<=N;j+=j&(-j))
            AIB[i][j]=0;
}
int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d%d",&N,&T);
    for(;T;T--)
    {
        for(i=1;i<=N;i++)
            scanf("%d%d%d",&C[i].X,&C[i].Y,&C[i].Z);

        sort(C+1,C+N+1,cmp); SOL=0;

        for(i=1;i<=N;i++)
        {
            A=C[i].Y; B=C[i].Z;
            S=Query(A-1,B-1)+1;
            SOL=max(SOL,S);
            Update(A,B,S);
        }

        for(i=1;i<=N;i++)
        {
            A=C[i].Y; B=C[i].Z;
            Clear(A,B);
        }

        printf("%d\n",SOL);
    }
    return 0;
}