Cod sursa(job #1425392)

Utilizator hrazvanHarsan Razvan hrazvan Data 27 aprilie 2015 13:22:55
Problema Cutii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#define MAXN 3500
int x[MAXN], y[MAXN], z[MAXN];
int aib[MAXN + 2][MAXN + 2];

inline int ultb(int x){
  return x & (-x);
}

inline int max2(int a, int b){
  return a > b ? a : b;
}

inline int maxim(int y, int z){
  int cz, rez = 0;
  while(y > 0){
    cz = z;
    while(cz > 0){
      rez = max2(rez, aib[y][cz]);
      cz &= cz - 1;
    }
    y &= y - 1;
  }
  return rez;
}

inline void add(int y, int z, int n, int val){
  int cz;
  while(y <= n){
    cz = z;
    while(cz <= n){
      aib[y][cz] = max2(aib[y][cz], val);
      cz += ultb(cz);
    }
    y += ultb(y);
  }
}

inline void intersch(int i, int j){
  int aux;
  aux = x[i];  x[i] = x[j];  x[j] = aux;
  aux = y[i];  y[i] = y[j];  y[j] = aux;
  aux = z[i];  z[i] = z[j];  z[j] = aux;
}

inline char better(int a1, int b1, int c1, int a2, int b2, int c2){
  if(a1 < a2)
    return 0;
  if(a1 > a2)
    return 1;
  if(b1 > b2)
    return 0;
  if(b1 < b2)
    return 1;
  if(c1 > c2)
    return 0;
  if(c1 < c2)
    return 1;
  return 0;
}

void qs(int st, int dr){
  int i = st, j = dr, min = (st + dr) / 2, pivx = x[min], pivy = y[min], pivz = z[min];
  while(i <= j){
    while(better(pivx, pivy, pivz, x[i], y[i], z[i]))
      i++;
    while(better(x[j], y[j], z[j], pivx, pivy, pivz))
      j--;
    if(i <= j){
      intersch(i, j);
      i++;  j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

int main(){
  FILE *in = fopen("cutii.in", "r");
  FILE *out = fopen("cutii.out", "w");
  int t, n, i, j, max, k;
  fscanf(in, "%d%d", &n, &t);
  for(; t > 0; t--){
    for(i = 0; i < n; i++){
      fscanf(in, "%d%d%d", &x[i], &y[i], &z[i]);
      x[i]++;  y[i]++;  z[i]++;
    }
    qs(0, n - 1);
    max = 0;
    for(i = 0; i < n; i++){
      k = maxim(y[i] - 1, z[i] - 1) + 1;
      max = max2(max, k);
      add(y[i], z[i], n + 1, k);
    }
    fprintf(out, "%d\n", max);
    for(k = 0; k < n; k++)
      for(i = y[k]; i <= n + 1; i += ultb(i))
        for(j = z[k]; j <= n + 1; j += ultb(j))
          aib[i][j] = 0;
  }
  fclose(in);
  fclose(out);
  return 0;
}