Cod sursa(job #732375)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 10 aprilie 2012 13:22:26
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#define NM 3510

using namespace std;

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

struct Cutie{int x,y,z;} C[NM];

inline bool comp(Cutie a,Cutie b) {
    if (a.x!=b.x) return a.x<b.x;
    if (a.y!=b.y) return a.y<b.y;
    return a.z<b.z;
}

int T,n,i,AIB[NM][NM],ANS,v,lsb[NM];

inline void Calc_lsb() {
    for (i=1;i<=n;i++)
        lsb[i]=(i&(-i));
}

inline int Query(int x,int y) {
    int i,j,ANS=0;
    for (i=x;i>=1;i-=lsb[i])
        for (j=y;j>=1;j-=lsb[j])
            ANS=max(ANS,AIB[i][j]);
    return ANS;
}

inline void Update(int x,int y,int v) {
    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],v);
    return;
}

inline void Clear(int y,int z) {
    int i,j;
    for (i=y;i<=n;i+=lsb[i])
        for (j=z;j<=n;j+=lsb[j])
        AIB[i][j]=0;
}

inline void Solve() {
    ANS=0;
    for (i=1;i<=n;i++)
        f >> C[i].x >> C[i].y >> C[i].z;
    sort(C+1,C+n+1,comp);
    for (i=1;i<=n;i++) {
        v=1+Query(C[i].y-1,C[i].z-1);
        Update(C[i].y,C[i].z,v);
        ANS=max(ANS,v);
    }
    for (i=1;i<=n;i++)
        Clear(C[i].y,C[i].z);
    g << ANS << '\n';
    return;
}

int main() {
    for (f >> n >> T,Calc_lsb();T;--T) {
        Solve();
    }
    f.close();g.close();
    return 0;
}