Cod sursa(job #525839)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 26 ianuarie 2011 15:29:13
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#define nmax 100001
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int lg[nmax],a[nmax],sr[nmax],n,nrc;

void solve();
void read();
int bsrc(int A[],int in,int sf,int val);
void write();
int main()
{
	read();
	solve();
	write();
	f.close();
	g.close();
	return 0;
}

void read()
{
	int i;
	f>>n;
	for (i=1;i<=n;++i)
		f>>a[i];
}

void solve()
{
	int i,p;
	nrc=1;
	sr[nrc]=0;
	lg[1]=n;
	for (i=n-1;i;--i)
	{
		p=bsrc(lg,1,nrc,a[i]);
		if (nrc==p)
		{
			++nrc;
			lg[nrc]=i;
		}
		else
			if (a[i]>a[lg[p+1]])
				lg[p+1]=i;
		sr[i]=lg[p];
	}
}

void write()
{
	int i;
	i=lg[nrc];
	g<<nrc<<'\n';
	while (i)
	{
		g<<a[i]<<' ';
		i=sr[i];
	}
}

int bsrc(int A[],int in,int sf,int val)
{
	int mij=in+((sf-in)>>1);
	if (sf>in) 
      if (val>=a[lg[mij]]) return bsrc(A,in,mij-1,val);
		else return bsrc(A,mij+1,sf,val);
	if (a[lg[mij]]<=val)
		return mij-1;
	return in;
}