Cod sursa(job #2641442)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 11 august 2020 13:56:13
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

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

int ANS,n,POZ,a[100010],b[100010],ans[100010],aib[100010];
vector<pair<int,int> > v;
vector<int> V;

int get_max(int val){
	if(!val)return 0;
	int ret=0;
	for(;val;val-=val&-val)
		ret=max(ret,aib[val]);
	return ret;
}

void upd(int poz,int val){
	for(;poz<=n;poz+=poz&-poz)
		aib[poz]=max(aib[poz],val);
	return ;
}
int main(){
	f>>n;
	for(int i=1;i<=n;i++){
		f>>a[i];b[i]=a[i];
		v.push_back({a[i],i});
	}
	sort(v.begin(),v.end());
	a[v[0].second]=1;
	for(int i=1;i<n;i++)
		if(v[i].first==v[i-1].first)
			a[v[i].second]=a[v[i-1].second];
		else
			a[v[i].second]=i+1;
	for(int i=1;i<=n;i++){
		ans[i]=get_max(a[i]-1)+1;
		upd(a[i],ans[i]);
		ANS=max(ANS,ans[i]);
	}
	for(int i=1;i<=n;i++)
		if(ans[i]==ANS)
			POZ=i;
	g<<ANS<<'\n';
	V.push_back(b[POZ]);
	for(int i=POZ-1;i;i--){
		if(a[i]<a[POZ]&&ans[i]==ans[POZ]-1){
			V.push_back(b[i]);
			POZ=i;
		}
	}
	reverse(V.begin(),V.end());
	for(auto it:V)
		g<<it<<' ';
	
}