Cod sursa(job #752405)

Utilizator ColcerPaulColcer Paul ColcerPaul Data 28 mai 2012 16:23:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>

long n, i, x[100001], position[100001], vm[100001], dad[100001], st, dr, mij, lmax;
void afis(long pc);
int main()
{
	freopen("scmax.in", "rt", stdin);
	freopen("scmax.out", "wt", stdout);
	scanf("%ld",&n);

	for(i = 1; i <= n; i++)
        scanf("%ld",&x[i]);

	lmax = 1;
	position[1] = 1;
	vm[1] = x[1];

	for(i = 2; i <= n; i++){
	    if(x[i] > vm[lmax]){
	        lmax++;
	        position[lmax] = i;
	        vm[lmax] = x[i];
	        dad[i] = position[lmax-1];
	        continue;
        }
        if(x[i] <= vm[1]){
            position[1] = i;
            vm[1] = x[i];
            dad[i] = 0;
            continue;
        }
        st = 1;
        dr = lmax;
	  while(dr-st > 1){
	      mij = (st + dr) / 2;
	    if(vm[mij] < x[i])
            st = mij;
	    else
            dr = mij;
	  }
        if(x[i] < vm[dr]){
            position[dr] = i;
            vm[dr] = x[i];
            dad[i] = position[st];
        }
	}
	printf("%ld\n", lmax);
	afis(position[lmax]);
	fcloseall();
	return 0;
}
void afis(long pc)
{
	if(!pc)
        return;
	afis(dad[pc]);
	printf("%ld ",x[pc]);
}