Cod sursa(job #1550509)

Utilizator daniel.grosuDaniel Grosu daniel.grosu Data 13 decembrie 2015 20:07:32
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>  
#include <algorithm>
#define lsb(a) (a&-a)
  
using namespace std;
  
const int NMAX = 100005;

int bit[NMAX],A[NMAX],norm[NMAX],res[NMAX],b[NMAX],pre[NMAX];

int rs,n;

void update(int x, int val)
{
	for(; x<=n; x+=lsb(x)){
		if(b[val]>b[bit[x]])
			bit[x]=val;
	}
}

int query(int x)
{
	int m=0;
	for(; x; x-=lsb(x))
	{
		if(b[bit[x]] > b[m])
			m=bit[x];
	}
	return m;
}

int main(void)
{

	int h=1,i;
	
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);

	scanf("%d", &n);
	for(i=1; i<=n; ++i){
		scanf("%d", &A[i]);
		res[i] = norm[i] = A[i];
	}
	sort(norm+1, norm+n+1);

	for(i=2; i<=n; ++i)
		if(norm[i] != norm[h])
			norm[++h] = norm[i];

	for(i=1; i<=n; ++i)
		A[i] = lower_bound(norm+1, norm+h+1, A[i]) - norm;

	for(i=1; i<=n; ++i)
	{
		pre[i] = query(A[i]-1);
		b[i] = b[pre[i]]+1;
		update(A[i], i);
	}

	for(i=1; i<=n; ++i)
		if(b[rs] < b[i])
			rs=i;

	printf("%d\n", b[rs]);
	for(h=0, i=rs; i; i=pre[i])
		norm[++h]=res[i];

	for(i=h; i; --i)
		printf("%d ", norm[i]);
	printf("\n");

	return 0;
}