Cod sursa(job #340935)

Utilizator mgntMarius B mgnt Data 17 august 2009 00:24:04
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
using namespace std ;

// BIT : Binary Indexed Tree (2d)
int const maxn = 3500 ;
int BIT[1+maxn][1+maxn];

void update (int n, int x, int y, int val) { int y1 ;
  for ( ; n >= x ; x += (x&(-x)) ) {
    for ( y1 = y ; n >= y1 ; y1 += (y1&(-y1)) ) { if(val>BIT[x][y1]) { BIT[x][y1]=val; } } }
}

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

struct cutie { int x, y, z; }; cutie C [maxn]; int Z [maxn];

int main ( ) {
  FILE * f = fopen ("cutii.in", "r"), * g  = fopen ( "cutii.out", "w" ) ; int n, t, s, i, u, w;
  fscanf ( f, "%d %d", & n, & t ) ;
  for ( s=0; t>s; ++s ) {
    for ( i=0; n>i; ++i ) { fscanf ( f, "%d %d %d", &C[i].x, &C[i].y, &C[i].z ) ; Z[C[i].z]=i; }
    for ( i=1; n >= i; ++i ) { for ( u=1; n >= u; ++u ) { BIT[i][u]=0; } }
    u=0;
    for ( i=1; n >= i; ++i ) {
      cutie & c = C[Z[i]]; w=read(c.x, c.y); if (u<w) {u=w;} update ( n, c.x, c.y, 1+w);
    }
    cutie & c = C[Z[n]]; w=read(c.x, c.y); if (u<w) {u=w;} fprintf ( g, "%d\n", u ) ;
  }
  fclose (f); fclose(g); return 0;
}