Cod sursa(job #705278)

Utilizator seviyorAgape Alexandru seviyor Data 3 martie 2012 22:17:07
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>

#define NMAX 100001

int v[NMAX+1];
int n;
int p[NMAX+1];
int sol[NMAX+1];

void print_sol(int i) {
	if (i) {
		print_sol(p[i]);
		printf("%d ", v[i]);	
	}	
}



int tree[NMAX+1];
void solve_aib() {
	int i, j, max=0, imax, idx, cand;
	sol[1] = 1; tree[1]=1;
	for (i=2;i<=n;i++) {
		idx = i-1;
		while (idx) {
			cand = tree[idx];
			if (v[cand]<v[i] && sol[cand]>sol[i]) { sol[i] = sol[cand]; p[i] = cand; } 
			sol[i]++;
			
			idx -= idx & (-idx);
		}
		
		idx = i;
		while(idx<=NMAX && sol[tree[idx]]<sol[i]) {
			tree[idx] = i;
			idx += idx&(-idx);	
		}
		
		if (sol[i]>max) {
			max = sol[i];
			imax = i;
		}
	}
	
	printf("%d\n", max);
	print_sol(imax);
}


int solve_n2() {
	int i, j, max=0, imax;
	sol[1] = 1;
	for (i=2; i<=n;i++) {
		//sol[i] = 1;
		for (j=1; j<i; j++) {
			if (v[j]<v[i] && sol[j]>sol[i]) {sol[i] = sol[j]; p[i]=j;}
		}
		sol[i]++;
		if (sol[i]>max) {
			max = sol[i];
			imax = i;
		}
	}
	
	printf("%d\n", max);
	print_sol(imax);
}

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", v+i);
	
	solve_aib();
	
	return 0;	
}