Cod sursa(job #1336369)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 7 februarie 2015 17:23:56
Problema Cutii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <stdio.h>
#define MAXN 3500
int aib[MAXN+1][MAXN+1], x[MAXN], y[MAXN], z[MAXN], n;
inline int tata(int p){
    return (p-1)>>1;
}
inline int fiust(int p){
    return (p<<1)+1;
}
inline int fiudr(int p){
    return (p<<1)+2;
}
inline void swap(int a, int b){
    int aux=x[a]; x[a]=x[b]; x[b]=aux;
    aux=y[a]; y[a]=y[b]; y[b]=aux;
    aux=z[a]; z[a]=z[b]; z[b]=aux;
}
inline void coborare(int p){
    int f=1, q;
    while((f==1)&&(fiust(p)<n)){
        q=fiust(p);
        if((fiudr(p)<n)&&(x[fiudr(p)]>x[q])){
            q=fiudr(p);
        }
        if(x[q]>x[p]){
            swap(p, q);
            p=q;
        }else{
            f=0;
        }
    }
}
inline void heapify(){
    int i;
    for(i=tata(n-1); i>=0; i--){
        coborare(i);
    }
}
inline void heapSort(){
    int cn=n;
    while(n>1){
        n--;
        swap(0, n);
        coborare(0);
    }
    n=cn;
}
inline int ub(int p){
    return p&(-p);
}
inline void reset(){
    int i, j, k;
    for(k=0; k<n; k++){
        for(i=y[k]; i>0; i-=ub(i)){
            for(j=z[k]; j>0; j-=ub(j)){
                aib[i][j]=0;
            }
        }
    }
}
inline int query(int a, int b){
    int i, j, ans=0;
    for(i=a; i>0; i-=ub(i)){
        for(j=b; j>0; j-=ub(j)){
            if(ans<aib[i][j]){
                ans=aib[i][j];
            }
        }
    }
    return ans;
}
inline void update(int a, int b, int val){
    int i, j;
    for(i=a; i<=n; i+=ub(i)){
        for(j=b; j<=n; j+=ub(j)){
            if(aib[i][j]<val){
                aib[i][j]=val;
            }
        }
    }
}
int main(){
    int gogu, g, i, ans, k;
    FILE *fin, *fout;
    fin=fopen("cutii.in", "r");
    fout=fopen("cutii.out", "w");
    fscanf(fin, "%d%d", &n, &gogu);
    for(g=0; g<gogu; g++){
        for(i=0; i<n; i++){
            fscanf(fin, "%d%d%d", &x[i], &y[i], &z[i]);
        }
        heapify();
        heapSort();
        ans=0;
        for(i=0; i<n; i++){
            k=query(y[i]-1, z[i]-1)+1;
            update(y[i], z[i], k);
            if(ans<k){
                ans=k;
            }
        }
        fprintf(fout, "%d\n", ans);
        reset();
    }
    fclose(fin);
    fclose(fout);
    return 0;
}