Cod sursa(job #1475131)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 23 august 2015 16:35:43
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <algorithm>

#define DIM 100010
#define INF ((1LL<<31)-1);

using namespace std;

int V[DIM], D[DIM], T[DIM], L[DIM];
int N, M, i, K;

int main(){

	freopen("scmax.in" ,"r", stdin );
	freopen("scmax.out","w", stdout);

	scanf("%d", &N);
	for(int i = 1; i <= N; i ++)
		scanf("%d", &V[i]);

    D[1] = 1; M = 1;
	for(int i = 2; i <= N; i ++){

		if(V[i] > V[D[M]]){

			D[++M] = i;
			T[i] = D[M-1];
		}
		else{
			int st = 1, dr = M;

			while(st <= dr){
				int mid = st + (dr - st) / 2;

				if(V[D[mid]] >= V[i])
					dr = mid - 1;
				else
					st = mid + 1;
			}

			if(V[D[st-1]] >= V[i]){
				D[st] = i;
				T[i] = D[st-1];
			}
		}
	}

	printf("%d\n", M);

	i = M;
	
	while(i != 0){
		
		L[++K] = V[i];
		i = T[i];
	}
	
	for(int i = K; i >= 1; i --)
		printf("%d ", L[i]);

	fclose(stdin );
	fclose(stdout);

	return 0;
}