Cod sursa(job #1223426)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 28 august 2014 10:19:42
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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){
    for(;p1<=n;p1+=lsb(p1))
        for(;p2<=n;p2+=lsb(p2))
            aib[p1][p2]=max(aib[p1][p2],val);
}

inline void update2(int p1,int p2){
    for(;p1<=n;p1+=lsb(p1))
        for(;p2<=n;p2+=lsb(p2))
            aib[p1][p2]=0;
}

inline int query(int p1,int p2){
    int ans=0;
    for(;p1;p1-=lsb(p1))
        for(;p2;p2-=lsb(p2))
            ans=max(ans,aib[p1][p2]);

    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;
}