Cod sursa(job #2672919)

Utilizator Gliumarin negai Gliu Data 15 noiembrie 2020 14:29:34
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
//#include <iostream>
#include <fstream>

using namespace std;
typedef long long ll;

ifstream cin("scmax.in");
ofstream cout("scmax.out");
const ll NMAX=100009;
ll a[NMAX],r[NMAX],n,ans,t[NMAX],k;

void afis(ll i){
	if(r[i]>0) afis(r[i]);
	cout<<a[i]<<" ";
}

binary_search(ll t[],ll a[],ll r,ll f){
	int l=1,mid,k=r;
	while(r>=l){
		mid=(l+r)/2;
		if(mid <k && a[t[mid]]<f && f<=a[t[mid+1]])
		   return mid+1;
		else if(a[mid]<f) 
		   l=mid+1;
		else 
		   r=mid-1;     
	}
	return 0;
}

int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
k=1;
t[k]=1;

for(int i=2;i<=n;i++){
	if(a[i]>a[t[k]]){
		t[++k]=i;
		r[t[k]]=t[k-1];
	}else if(a[i]<a[t[1]]){
		r[i]=0;
		t[1]=i;
	}else if(a[i] <a[t[k]]){
		
		ans =binary_search(t,a,k,a[i]);
		t[ans]=i;
		r[t[ans]]=t[ans-1];
	}	
}
cout<<k<<"\n";
afis(t[k]);
return 0;
}