Cod sursa(job #856988)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 17 ianuarie 2013 09:37:55
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <algorithm>
#define Nmax 3600
#define max(a,b) ((a)>(b)?(a):(b))
#define LSB(x) (x&-x)
using namespace std;

struct box{int X,Y,Z;}Box[Nmax];
int T,N,Sol,AIB[Nmax][Nmax];

void Reset(int X,int Y) {

    int i,j;

    for(i=X;i<=N;i+=LSB(i))
        for(j=Y;j<=N;j+=LSB(j))
            AIB[i][j]=0;

}
void Update(int X,int Y,int Val) {

    int i,j;

    for(i=X;i<=N;i+=LSB(i))
        for(j=Y;j<=N;j+=LSB(j))
            AIB[i][j]=max(AIB[i][j],Val);

}
int Query(int X,int Y) {

    int i,j,Res=0;

    for(i=X;i>0;i-=LSB(i))
        for(j=Y;j>0;j-=LSB(j))
            Res=max(Res,AIB[i][j]);

    return Res;

}
bool cmp(box A,box B) {
    return A.X<B.X;
}
void Solve() {

    int i,Res;

    Sol=0;
    sort(Box+1,Box+N+1,cmp);

    for(i=1;i<=N;i++) {

        Res=Query(Box[i].Y-1,Box[i].Z-1)+1;
        Update(Box[i].Y,Box[i].Z,Res);
        Sol=max(Sol,Res);

        }

    for(i=1;i<=N;i++)
        Reset(Box[i].Y,Box[i].Z);

}
void Read(ifstream & in) {

    for(int i=1;i<=N;i++)
        in>>Box[i].X>>Box[i].Y>>Box[i].Z;

}
void Write(ofstream & out) {

    out<<Sol<<'\n';

}
int main() {

    ifstream in("cutii.in");
    ofstream out("cutii.out");
    in>>N>>T;

    while(T--) {
        Read(in);
        Solve();
        Write(out);
        }

    in.close();
    out.close();

    return 0;

}