Cod sursa(job #480550)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 28 august 2010 15:32:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<stack>
#include<iterator>

using namespace std;

int findpos(vector<long>& v, vector<long>& scmax,int scmaxsize, long val)
{
	int l=0,r=scmaxsize,index=(l+r)/2;
	//cout<<l<<" - "<<r<<" with "<<val<<endl;
	while(l<r)
	{
		index=(l+r)/2;
		//cout<<l<<" "<<r<<" "<<index<<endl;
		if(val>v[scmax[index]])
		{
			l=index+1;
		}
		else if(val<v[scmax[index]])
		{
			r=index;
		}
		else
			return index;
	}
	return r;
}

int main()
{
	fstream fin("scmax.in", fstream::in);
	fstream fout("scmax.out", fstream::out);
	
	int n,scmaxsize=0;
	long x;
	vector<long> v,scmax,bst,pre;
	fin>>n;
	pre.resize(n);
	scmax.resize(n);
	bst.resize(n);
	for(int i=0; i<n; ++i)
	{
		fin>>x;
		v.push_back(x);
		//cout<<v[i]<<" ";
	}
	
	for(int i=0; i<n; ++i)
	{
		int j=0;
		/*while(j<scmaxsize && v[scmax[j]]<v[i])
		{
			j++;
		}
		*/
		j=findpos(v, scmax, scmaxsize, v[i]);
		if(j==scmaxsize)
			scmaxsize++;
		scmax[j]=i;
		bst[i]=j+1;
		if(j>0)
			pre[i]=scmax[j-1];
		else
			pre[i]=-1;
		/*cout<<j<<"\nscmax: "<<endl;
		for(int l=0; l<scmaxsize; ++l)
		{
			cout<<v[scmax[l]]<<" ";
		}
		cout<<endl;*/
	}
	//cout<<"\n";

	int max=0,pos;
	for(int i=0; i<n; ++i)
	{
		if(bst[i]>max)
		{
			max=bst[i];
			pos=i;
		}
	}
	fout<<max<<"\n";
	stack<long> st;
	while(pos!=-1)
	{
		st.push(v[pos]);
		pos=pre[pos];
	}
	while(!st.empty())
	{
		fout<<st.top()<<" ";
		st.pop();
	}
	//cout<<"\n";
	fin.close();
	fout.close();
	return 0;
}