Cod sursa(job #1223437)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 28 august 2014 10:30:31
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <algorithm>

using namespace std;

struct cutie{
    int h,w,l;

    cutie(int h=0,int w=0,int l=0): h(h), w(w), l(l) {}
}v[3505];

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

#define lsb(x) ((x)&(-x))
int aib[3505][3505];
int n;

inline void update(int p1,int p2,int val){
    int i,j;

    for(i=p1;i<=n;i+=lsb(i))
        for(j=p2;j<=n;j+=lsb(j))
            aib[i][j]=max(aib[i][j],val);
}

inline void update2(int p1,int p2){
    int i,j;

    for(i=p1;i<=n;i+=lsb(i))
        for(j=p2;j<=n;j+=lsb(j))
            aib[i][j]=0;
}

inline int query(int p1,int p2){
    int ans=0;
    int i,j;

    for(i=p1;i;i-=lsb(i))
        for(j=p2;j;j-=lsb(j))
            ans=max(ans,aib[i][j]);

    return ans;
}

int din[3505];

int main()
{
    ifstream cin("cutii.in");
    ofstream cout("cutii.out");

    int t=0;
    cin>>n>>t;

    while(t--){
        for(int i=1;i<=n;i++)
            cin>>v[i].h>>v[i].w>>v[i].l;
        sort(v+1,v+n+1);

        int ans=0;
        for(int i=1;i<=n;i++){
            din[i]=query(v[i].w-1,v[i].l-1)+1;
            if(din[i]>ans)
                ans=din[i];

            update(v[i].w,v[i].l,din[i]);
        }

        cout<<ans<<'\n';
        for(int i=1;i<=n;i++)
            update2(v[i].w,v[i].l);

    }

    cin.close();
    cout.close();
    return 0;
}