Cod sursa(job #531615)

Utilizator bora_marianBora marian bora_marian Data 9 februarie 2011 22:33:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
#define DIM 100003
using namespace std;
int father[DIM],l[DIM],v1[DIM],n,cresc1[DIM],poz,maxim;
void cauta(int st,int dr,int val,int v[]);
void subsir_crescator(int v[],int cresc[]);
ofstream fout("scmax.out");
void inter();
int main()
{
	ifstream fin("scmax.in");
	fin>>n;
	int i;
	for(i=1;i<=n;i++)
	   fin>>v1[i];
	v1[0]=n;   
	subsir_crescator(v1,cresc1);
	fout<<cresc1[0]<<"\n";
	for(i=1;i<=cresc1[0];i++)
	   fout<<v1[cresc1[i]]<<" ";
	return 0;
}
void subsir_crescator(int v[],int cresc[])
{
	int nr=1;
	l[1]=1;
	int i;
	for(i=2;i<=n;i++)
	{
		poz=0;
		cauta(1,nr,v[i],v);
		father[i]=l[poz];
		if(l[poz+1]==0)
		   l[poz+1]=i;
		if(v[l[poz+1]]>v[i])
		  l[poz+1]=i;
		if(poz+1>nr)
		  nr=poz+1;
	  }
	  cresc[0]=nr;
	  cresc[nr]=l[nr];
	  int bau=l[nr];
	  nr--;
	  while(nr>0)
	  {        
          cresc[nr]=father[bau];
          bau=father[bau];
          nr--;
	  }
}
void cauta(int st,int dr,int val,int v[])
{
	if(st==dr)
	{
		if(st>poz && v[l[st]]<val)
		  poz=st;
		return ;
	}
	else
	{
		int mij=(st+dr)/2;
		if(v[l[mij]]<val)
		{
		  if(mij>poz)
		    poz=mij;
		  cauta(mij+1,dr,val,v);
	     }
	     else
	        cauta(st,mij,val,v);
	  }
}