Cod sursa(job #2633925)

Utilizator etohirseCristi Cretu etohirse Data 9 iulie 2020 11:15:58
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.74 kb
#include <bits/stdc++.h>
using namespace std;
const int mxN=1e5+3;
int v[mxN], p[mxN], l[mxN], best[mxN];
int n, k, poz, nr, lung;
int cbin(int x){
	int lb=0, rb=nr;
	while(lb<=rb){
		int mb=(lb+rb)/2;
		if(v[l[mb]]<x&&v[l[mb+1]]<=x)
			return mb;
		else if(v[l[mb+1]]<x)
			lb=mb+1;
		else rb=mb-1;
	}
	return nr;
}

int main(){
	ifstream cin("scmax.in");
	ofstream cout("scmax.out");
	cin >> n;
	for(int i=1; i<=n; ++i)
		cin >> v[i];
	best[1]=l[1]=1, l[0]=0; nr=1;
	for(int i=2; i<=n; ++i){
		poz=cbin(v[i]);
		p[i]=l[poz];
		best[i]=poz+1;
		l[poz+1]=i;
		if(nr<poz+1) nr=poz+1;
	}
	lung = 0, poz = 0;
	for(int i=1; i<=n; ++i)
		if(lung<best[i])
			lung=best[i], poz=i;
	cout<<lung<<'\n';
	for(int i=lung; i<=n; ++i)
		if(p[i]>0)
			cout << v[i] << ' ';
}