Cod sursa(job #1496789)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 5 octombrie 2015 16:54:23
Problema Cutii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 3500
#define zeros(x) (x&(-x))
int x[MAXN],y[MAXN],z[MAXN],aib[MAXN+1][MAXN+1],D[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);
}
inline int querry(int l,int c){
    int max=0,i,j;
    for(i=l;i>0;i-=zeros(i))
        for(j=c;j>0;j-=zeros(j))
           if(D[aib[i][j]]>max)
               max=D[aib[i][j]];
    return max;
}
inline void update(int l,int c,int poz,int n){
    int i,j;
    for(i=l;i<=n;i+=zeros(i))
        for(j=c;j<=n;j+=zeros(j))
            if(D[poz]>D[aib[l][c]])
                aib[l][c]=poz;
}
int main(){
    FILE*fi,*fout;
    int t,i,n,max;
    fi=fopen("cutii.in" ,"r");
    fout=fopen("cutii.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&t);
    while(t){
        for(i=1;i<=n;i++)
            fscanf(fi,"%d%d%d" ,&x[i],&y[i],&z[i]);
        myqsort(1,n,x);
        max=0;
        for(i=1;i<=n;i++){
            D[i]=querry(y[i]-1,z[i]-1)+1;
            update(y[i],z[i],i,n);
            if(D[i]>max)
                max=D[i];
        }
        fprintf(fout,"%d\n" ,max);
        t--;
    }
    fclose(fi);
    fclose(fout);
    return 0;
}