Cod sursa(job #2578192)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 10 martie 2020 18:37:30
Problema Subsir crescator maximal Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;
int n,v[100003],aib[100003],a[100003],sol[100003],maxim,best[100003],a1[100005];
int cb (int nr) {
	int i=0,step=1;
	for(;(step<<1)<=n;step<<=1);
	for(;step>0;step>>=1)
		if(i+step<=n && a[i+step]<nr)
			i+=step;
	return i+1;
}
int lsb (int nr) {
	return (nr & (-nr));
}
void updatee (int poz, int val ) {
	while(poz<=n) {
		if(best[val]>best[aib[poz]])
			aib[poz]=val;
		poz=poz+lsb(poz);
	}
}
int querrys (int dr) {
	maxim=0;
	while(dr>0) {
		if(best[aib[dr]]>best[maxim])
			maxim=aib[dr];
		dr=dr-lsb(dr);
	}
	return maxim;
}
int main () {
	int poz,kontor=0;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d", &n);
	for(int i=1;i<=n;++i)
		scanf("%d", &v[i]),a[i]=v[i],a1[i]=v[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;++i)
		v[i]=cb(v[i]);
	for(int i=1;i<=n;++i) {
		best[i]=best[querrys(v[i]-1)]+1;
		updatee(v[i],i);
	}
	maxim=-1;poz=0;
	for(int i=1;i<=n;++i)
		if(best[i]>maxim)
			maxim=best[i],poz=i;
	sol[++kontor]=a1[poz];
	for(int i=poz-1;i>0 && kontor<maxim;--i)
		if(best[i]==best[poz]-1 && a1[i]<a[poz])
			sol[++kontor]=a1[i],poz=i;
	printf("%d\n", maxim);
	for(int i=kontor;i>0;--i)
		printf("%d ", sol[i]);
	return 0;
}