Cod sursa(job #1096574)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 2 februarie 2014 12:31:53
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int NMAX = 3500+5;

struct Box
{
    int x,y,z;
    bool operator()(Box A,Box B)
    {
        return A.x<B.x;
    }
};

int N,T,Sol;
Box V[NMAX];
int AIB[NMAX][NMAX];

int Query(int x,int y)
{
    int i,j,ans=0;
    for(i=x; i; i-=i&(-i))
        for(j=y; j; j-=j&(-j))
            ans=max(ans,AIB[i][j]);
    return ans;
}

void Update(int x,int y,int w)
{
    int i,j;
    for(i=x; i<=N; i+=i&(-i))
        for(j=y; j<=N; j+=j&(-j))
            AIB[i][j]=max(w,AIB[i][j]);
}

void Clear(int x,int y)
{
    int i,j;
    for(i=x; i<=N; i+=i&(-i))
        for(j=y; j<=N; j+=j&(-j))
            AIB[i][j]=0;
}

int main()
{
    int i,x;

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

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

    for(; T; --T)
    {
        Sol=0;

        for(i=1; i<=N; i++)
            scanf("%d%d%d",&V[i].x,&V[i].y,&V[i].z);

        sort(V+1,V+N+1,Box());

        for(i=1; i<=N; i++)
        {
            x=Query(V[i].y-1,V[i].z-1)+1;
            Update(V[i].y,V[i].z,x);
            Sol=max(Sol,x);
        }

        printf("%d\n",Sol);

        for(i=1; i<=N; i++)
            Clear(V[i].y,V[i].z);
    }

    return 0;
}