Cod sursa(job #547847)

Utilizator bog29Antohi Bogdan bog29 Data 6 martie 2011 19:04:38
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define dmax 100003
using namespace std;

int n,x[dmax],aib[dmax],scm[dmax],m,pre[dmax],y[dmax],ult;

vector<int>v;
vector<int>::iterator it,ne;

void getsol(int k)
{	
	if(pre[k]!=0)
	{	getsol(pre[k]);
		printf("%d ", x[pre[k]]);
	}	
}


void norm()
{	int i;
	
	sort(v.begin(), v.end() );
	ne=unique(v.begin(), v.end() );
	v.erase(ne, v.end() );
	
}

void update(int k)
{	
	int poz=k;

	it=lower_bound(v.begin(), v.end(), x[k]);
	poz=it-v.begin()+1;
	
	aib[poz]=scm[k];
	y[poz]=k;
	
	while(poz < n && poz < dmax)
	{	
		poz+=(poz & -poz);
		if( (aib[poz]==0 || aib[poz] < scm[k]) && poz < dmax)
		{	aib[poz]=scm[k];
			y[poz]=k;
		}	
	}
}


int query(int k)
{	
	int poz, mx;
	
	it=lower_bound(v.begin(), v.end(), x[k]);
	poz=it-v.begin();
	
	mx=aib[poz];
	pre[k]=y[poz];
	
	while(poz > 0)
	{	
		poz-=(poz & -poz);
		
		if(aib[poz] > mx)
		{	mx=aib[poz];
			pre[k]=y[poz];
		}	
	}

	return mx;
}	


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", &x[i]);
		v.push_back(x[i]);
	}	
	
	
	norm();
	
	for(i=1;i<=n;i++)
	{		
		scm[i] = query(i)+1;
		update(i);
		
		if(scm[i] > m)
		{	m=scm[i];
			ult=i;
		}
	}
	
	printf("%d\n", m);
	
	getsol(ult);
	printf("%d", x[ult]);
	

	return 0;
}