Cod sursa(job #775364)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 7 august 2012 22:07:10
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <algorithm>
#define LE 100600
#define zeros(X) ((X^(X-1))&X)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int poz_max,maxim,aux[LE],v[LE],n,A[LE],i,ind[LE],t,valu[LE],ve[LE],k;
inline bool cmp(int AA,int BB)
{
	return v[AA]<v[BB];
}
inline void Push(int poz,int val)
{
	for(;poz<=n;poz+=zeros(poz))
	  A[poz]=max(A[poz],val);
}
inline int query(int poz)
{
	int rez=0;
	for(;poz;poz-=zeros(poz))
		rez=max(rez,A[poz]);
	return rez;
}
int main()
{
	f>>n;
	for(i=1;i<=n;++i) f>>v[i],ind[i]=i;
	
	sort(ind+1,ind+n+1,cmp);
	
	for(i=1;i<=n;++i)
		if (v[ind[i]]!=v[ind[i-1]]) valu[ind[i]]=(++t);
	else valu[ind[i]]=t;
		
	for(i=1;i<=n;++i)
	{
		aux[i]=query(valu[i]-1)+1;
		Push(valu[i],aux[i]);
		
		poz_max=aux[i]>maxim?i:poz_max;
		maxim=aux[i]>maxim?aux[i]:maxim;
	}
	g<<maxim<<'\n';
	
	for(int maxval=v[poz_max]+1;poz_max;poz_max--)
		if (aux[poz_max]==maxim&&v[poz_max]<maxval) 
		{
			maxim--;
	     	maxval=v[poz_max];
		    ve[++k]=v[poz_max];
		}
		for(i=k;i>=1;--i) 
			g<<ve[i]<<" ";
	f.close();g.close();
	return 0;
}