Cod sursa(job #483427)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 8 septembrie 2010 17:26:50
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

struct cutie{
int x;
int y;
int z;
};
cutie V[3505];

int L,N,P[3505];

struct cmp{

public :
    bool operator()(const cutie&a,const cutie&b){return a.z<b.z;}
};

bool mare(const cutie &a,const cutie &b)
{
    if(a.x>b.x&&a.y>b.y&&a.z>b.z)return 1;
    return 0;
}

int search(cutie key)
{
    int i,step=1;
    while((step<<1)<=L)step<<=1;
    for(i=0;step;step>>=1)
        if(i+step<=L&&mare(key,V[P[i+step]]))
            i+=step;
    return i;
}

int main()
{
    int T,i,l,j;
    in>>N>>T;
    while(T--)
    {
        for(i=0;i<=N+1;++i)P[i]=0;
        for(i=1;i<=N;i++)
            in>>V[i].x>>V[i].y>>V[i].z;
        sort(V+1,V+N+1,cmp());
        P[1]=1,L=1;
        /*for(i=2;i<=N;i++)
        {
            l = search(V[i]);
            if(P[l+1]==0)P[l+1]=i,L++;
            else if(mare(V[P[l+1]],V[i]))
                    P[l+1]=i;
        }*/
        for(i=2;i<=N;i++)
        {
            if(!P[i])P[i]=1;
            for(j=i-1;j;j--)
                if(mare(V[i],V[j])&&P[i]<P[j]+1)
                    P[i]=P[j]+1;
            if(P[i]>L)
            L=P[i];
        }
        out<<L<<'\n';
    }
    return 0;
}