Cod sursa(job #671293)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 31 ianuarie 2012 09:20:31
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <vector>
#define NMAx 100100
using namespace std;
int n,a=1,b=1,sol=1,poz,v[NMAx],best[NMAx],L[NMAx],tata[NMAx];
ofstream out("scmax.out");

int cautB(int val) {
	
	int i,step;
	
	for(step=1;step<b;step<<=1);
	
	for(i=0;step;step>>=1)
		if(i+step<=b&&v[L[i+step]]<val)
			i+=step;
	
	if(v[L[i]]<val)
		return i;
	else
		return 0;

}
void afis(int i) {
	
	if(tata[i])
		afis(tata[i]);
	out<<v[i]<<' ';
	
}
int main() {
	
	int i,p;
	ifstream in("scmax.in");
	in>>n>>v[1];
	best[1]=1;
	L[1]=1;
	
	for(i=2;i<=n;i++) {
		in>>v[i];
		p=cautB(v[i]);
		tata[i]=L[p];
		best[i]=p+1;
		if(!L[p+1]||v[L[p+1]]>v[i])
			L[p+1]=i;
		if(b<p+1)
			b=p+1;
		if(sol<best[i]) {
			sol=best[i];
			poz=i;
			}
		}
	
	out<<sol<<'\n';
	afis(poz);
	out<<'\n';
	out.close();
	
	return 0;
}