Cod sursa(job #1202059)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 26 iunie 2014 19:02:44
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream o("scmax.out");
int n,a[100100],b[210000],pre[100010],best[100010],last,lb=1,sol=1;
/*void sortq(int l,int r){
	int m = c[(l+r)/2], i=l, j=r;
	do{
		while(c[i]<m)i++;
		while(c[j]>m)j--;
		if(i<=j){
			swap(d[i],d[j]);
			swap(c[i],c[j]);
			i++;
			j--;
		}
	}while(i<=j);
	if(i<r)sortq(i,r);
	if(j>l)sortq(l,j);
}*/
int binary(int l,int r, int x){
	if(l==r)return l;
	int m = (l+r)/2;
	if(b[m+1]>x)return binary(m+1,r,x);
	else return binary(l,m,x);
}
int main(){
f>>n;
for(int i=1;i<=n;i++)f>>a[i];
//	sortq(1,n);
best[n]=1;
b[1] = a[n];
b[0] = 0;

for(int i=n-1;i;i--){
	int maxim = binary(0,lb,a[i])+1;
	best[i]=maxim;
	b[maxim] = max(b[maxim],a[i]);
	if(best[i]>sol){
		sol = maxim;
		last = i;
		lb++;
	}
}
o<<sol<<"\n"<<a[last]<<" ";
int val = a[last];sol--;
for(int i=last+1;i<=n;i++)
 if(a[i]>val && best[i]==sol){
 	o<<a[i]<<" ";
 	sol--;
 	val = a[i];
 }
}