Cod sursa(job #732372)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 10 aprilie 2012 13:14:25
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#define lsb(a) (a&(-a))
#define NM 3510

using namespace std;

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

struct Cutie{int x,y,z;} C[NM];
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;

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

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

void Solve() {
    memset(AIB,0,sizeof(AIB));
    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].x-1,C[i].y-1);
        Update(C[i].x,C[i].y,v);
        ANS=max(ANS,v);
    }
    g << ANS << '\n';
    return;
}

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