Cod sursa(job #1494208)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 30 septembrie 2015 20:17:49
Problema Cutii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 3500
int x[MAXN],y[MAXN],z[MAXN],Qy[MAXN+1],Qz[MAXN+1];
inline void swap(int b,int e,int *v){
    int aux=v[b];
    v[b]=v[e];
    v[e]=aux;
}
void myqsort(int begin,int end,int *v){
    int b=begin,e=end,pivot=v[(b+e)/2];
    while(b<=e){
        while(v[b]<pivot) b++;
        while(v[e]>pivot) e--;
        if(b<=e){
            swap(b,e,x);
            swap(b,e,y);
            swap(b,e,z);
            b++;
            e--;
        }
    }
    if(begin<e) myqsort(begin,e,v);
    if(b<end) myqsort(b,end,v);
}

int main(){
    FILE*fi,*fout;
    int t,i,rez,pas,con,n,j;
    fi=fopen("cutii.in" ,"r");
    fout=fopen("cutii.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&t);
    while(t){
        for(j=0;j<n;j++)
            fscanf(fi,"%d%d%d" ,&x[j],&y[j],&z[j]);
        myqsort(0,n-1,x);
        con=0;
        for(i=0;i<n;i++){
            if(con==0){
                Qz[1]=z[i];
                Qy[1]=y[i];
                con++;
            }
            else
                 if(Qy[con]<y[i]){
                      con++;
                      Qy[con]=y[i];
                      Qz[con]=z[i];
                 }
                 else{
                     rez=0;
                     for(pas=1<<13;pas;pas>>=1)
                          if(rez+pas<=con&&Qy[rez+pas]<y[i])
                             rez+=pas;
                     rez++;
                     if(z[i]>Qz[con]){
                          Qy[rez]=y[i];
                          Qz[rez]=z[i];
                     }
                     else{
                        while(rez<=con&&Qz[rez]<z[i])
                           rez++;
                        Qy[rez]=y[i];
                        Qz[rez]=z[i];
                        if(rez==con+1)
                           con++;
                     }
                 }
        }
        fprintf(fout,"%d\n" ,con);
        t--;
    }
    fclose(fi);
    fclose(fout);
    return 0;
}