Cod sursa(job #823861)

Utilizator zamfiMihai Zamfirescu zamfi Data 25 noiembrie 2012 17:53:28
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<stdlib.h>
int read(char*b,long**s){FILE*in;int i,n;in=fopen("scmax.in","r");fscanf(in,"%d",&n);*s=(long*)calloc(n,sizeof(long));for(i=0;i<n;i++){fscanf(in,"%ld",(*s)+i);}fclose(in);return n;}int set_rank(long q,long t[],int first,int last){if(first==last){if(q<=t[first]){t[first]=q;return first;}else{t[++last]=q;return last;}}int p=(first+last)/2;if(q>t[p]){return set_rank(q,t,++p,last);}return set_rank(q,t,first,p);}int search_catalog(int n,long s[],long c[]){long*t;int*rank;int rm=0,rc=0,i;t=(long*)calloc(n,sizeof(long));rank=(int*)calloc(n,sizeof(int));t[0]=s[0];rank[0]=0;for(i=1;i<n;i++){rank[i]=set_rank(s[i],t,0,rm);if(rank[i]>rm){rm=rank[i];}}rc=rm;for(i=n-1;i>=0;i--){if(rank[i]==rc){c[rc]=s[i];rc--;}if(rc<0){break;}}free(t);free(rank);return rm+1;}void write(char*out_name,int d,long c[]){FILE*out;int i;out=fopen("scmax.out","w");fprintf(out,"%d\n",d);for(i=0;i<d;i++){fprintf(out,"%ld ",c[i]);}fclose(out);}int main(int argc,char**argv){long*c,**s;int n,d;s=(long**)malloc(sizeof(long*));n=read(argv[1],s);c=(long*)calloc(n,sizeof(long));d=search_catalog(n,*s,c);write(argv[2],d,c);free(*s);free(s);free(c);return 0;}