Cod sursa(job #2636868)

Utilizator etohirseCristi Cretu etohirse Data 20 iulie 2020 14:47:51
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int mxN=1e5+3;
int n, poz, nr, lung;
int v[mxN], best[mxN], lg[mxN], p[mxN];
void afis(int i){
	if(p[i]>0) afis(p[i]);
	cout << v[i] << ' ';
}
int cautbin(int x){
	int lb=0, rb=nr;
	while(lb<=rb){
		int mb=(lb+rb)/2;
		if(v[lg[mb]]<x&&v[lg[mb+1]]>=x)
			return mb;
		else if(v[lg[mb+1]]<x)
			lb=mb+1;
		else
			rb=mb-1;
	}
	return nr;
}

int main(){
	cin >> n;
	for(int i=1; i<=n; ++i)
		cin >> v[i];
	best[1]=lg[1]=1, lg[0]=0, nr=1;
	for(int i=2; i<=n; ++i){
		poz = cautbin(v[i]);
		p[i]=lg[poz];
		best[i]=poz+1;
		lg[poz+1]=i;
		if(nr<poz+1) nr=poz+1;
	}
	lung = poz = 0;
	for(int i=1; i<=n; ++i)
		if(lung<best[i])
			lung=best[i], poz=i;
	cout << lung << '\n';
	afis(poz);
}