Cod sursa(job #627373)

Utilizator sebii_cSebastian Claici sebii_c Data 29 octombrie 2011 18:20:04
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#define NMAX 100010

int A[NMAX], pre[NMAX], len[NMAX], L[NMAX], poz, max;
int n, nr;

int bs(int x)
{
    int low = 0, high = nr;
    int mid = low + (high-low)/2;
    while (low <= high) {
	if (A[L[mid]] < x && A[L[mid+1]] >= x)
	    return mid;
	else if (A[L[mid+1]] < x) {
	    low = mid+1;
	    mid = low + (high-low)/2;
	}
	else {
	    high = mid-1;
	    mid = low + (high-low)/2;
	}
    }
    return nr;
}

void print(int i)
{
    if (pre[i] > 0)
	print(pre[i]);
    printf("%d ", A[i]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int i;
    scanf("%d", &n);
    for (i=1; i<=n; ++i)
	scanf("%d", &A[i]);
    nr = 1;
    len[1] = L[1] = 1;
    for (i=2; i<=n; ++i) {
	int p = bs(A[i]);
	pre[i] = L[p];
	len[i] = p + 1;
	L[p+1] = i;
	if (nr < p+1)
	    nr = p+1;
    }
    
    for (i=1; i<=n; ++i) 
	if (len[i] > max) {
	    max = len[i];	
	    poz = i;
	}
    
    printf("%d\n", max);
    i = poz;
    print(i);
    return 0;
}