Cod sursa(job #2835187)

Utilizator ViAlexVisan Alexandru ViAlex Data 18 ianuarie 2022 10:59:13
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

const int mx=1e5+100;
const int inf=2e9+100;

int n,v[mx],dp[mx],ind[mx],prv[mx],result[mx];

void read(){
	in>>n;
	for(int i=0;i<n;i++){
		in>>v[i];
	}
}

int search(int x){
	int l=0,r=n,m;
	while(l<r){
		m=(l+r)/2;
		if(dp[m]<=x){
			l=m+1;
		}
		else{
			r=m;
		}
	}
	return l;
}

void solve(){
	dp[0]=-inf;
	ind[0]=-1;

	for(int i=1;i<=n;i++)
		dp[i]=inf;

	for(int i=0;i<n;i++){
		int j=search(v[i]);
		if(dp[j-1]<v[i]){
			dp[j]=v[i];		
			ind[j]=i;
			prv[i]=ind[j-1];
		}
	}
	int length=0;
	for(int i=0;i<=n;i++){
		if(dp[i]!=inf){
			length=i;
		}
	}
	int now=ind[length],cnt=0;

	while(now!=-1){
		result[cnt++]=v[now];
		now=prv[now];
	}
	out<<length<<'\n';
	for(int i=cnt-1;i>=0;i--)
		out<<result[i]<<" ";
	
}

int main(){
	read();
	solve();
	return 0;
}