Cod sursa(job #341919)

Utilizator mgntMarius B mgnt Data 19 august 2009 23:12:50
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
using namespace std;

int N;
int BIT[3501][3501];

int bitR (int x, int y1) {
    int y, m=0;
    for ( ; 0<x; x-=(x&(-x)) ) {
        for ( y=y1; 0<y; y-=(y&(-y)) ) {
            if (m<BIT[x][y]) {
                m=BIT[x][y];
            }
        }
    }
    return m;
}

void bitC (int x, int y1) {
    int y;
    for ( ; 0<x; x-=(x&(-x)) ) {
        for ( y=y1; 0<y; y-=(y&(-y)) ) {
            BIT[x][y]=0;
        }
    }
}

void bitW (int x, int y1, int v) {
    int y;
    for ( ; N>=x; x+=(x&(-x)) ) {
        for ( y=y1; N>=y; y+=(y&(-y)) ) {
            if (v>BIT[x][y]) {
                BIT[x][y]=v;
            }
        }
    }
}



struct Cu { int x, y, z; }; Cu C[3500]; int Z[3501];

int
main ( ) {
    FILE * f, * g ;
    f=fopen("cutii.in", "r");
    g=fopen("cutii.out", "w");
    int T, s, m, k;
    fscanf (f, "%d %d", &N, &T);
    for ( ;0<T; --T ) {
        for ( s=0; N>s; ++s ) {
            fscanf (f, "%d %d %d", &C[s].x, &C[s].y, &C[s].z); Z[C[s].z]=s;
        }
        for ( s=0; N>s; ++s ) { bitC(C[s].x-1, C[s].y-1); } k=0;
        for ( s=1; N>=s; ++s ) {
            Cu & c=C[Z[s]]; m=1+bitR(c.x-1, c.y-1); if(m>k) {k=m;}
            bitW(c.x,c.y,m);
        }
        fprintf (g, "%d\n", k);
    }
    fclose(f); fclose(g); return 0;
}