Cod sursa(job #824173)

Utilizator SerbanuMardaloescu Serban Serbanu Data 25 noiembrie 2012 22:45:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<stdio.h>
long n,v[100003],max=1,lung[100003],p[100003],coresp[100003];
FILE*f=fopen("scmax.in","r"),*g=fopen("scmax.out","w");

void citire(){
    fscanf(f,"%ld ",&n);
	for(long i=1;i<=n;i++){
	   fscanf(f,"%ld ",&v[i]);
	}
	fclose(f);
}

long cautare(long x){
    long in=1,sf=max,m;
	while(in<=sf){
		m=(in+sf)/2;
		if(v[p[m]]<x){
		  in=m+1;
		}
		else sf=m-1;
	}
	return in;
}

void determinare_subsir(){
	p[1]=1;
	lung[1]=1;
	long poz=0;
    for(long i=2;i<=n;i++){
	   poz=cautare(v[i]);
	   p[poz]=i;
	   lung[i]=poz;
	   coresp[i]=p[poz-1];
	   if(poz>max){max=poz;}
	   
	}
}

void corespondenta(long x){
   if(coresp[x]!=0)corespondenta(coresp[x]);
   fprintf(g,"%ld ",v[x]);
}

void afisare(){
    fprintf(g,"%ld\n",max);
	for(long i=1;i<=n;i++){
	    if(lung[i]==max){
		  corespondenta(i);
		  break;
		}
	}
	fclose(g);
}

int main(){
citire();
determinare_subsir();
afisare();
return 0;
}