Cod sursa(job #567514)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 30 martie 2011 09:48:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb

#include <cstdio>
#include <fstream>
#include <algorithm>

using namespace std;

#define N 100005

int nesrt[N], srt[N],ind[N];
int n;
int V[N], // Valorile din AIB
	aib[N]; // Indici din AIB
int que[N]; // un fel de coda

int srch (int x){
	
	int m=0;
	for(;x;x-=(x&(-x)))
		if(V[aib[x]]>V[m])
			m=aib[x];
	
	return m;}
	
	void up (int x,int i){
		
		for(;x<=N;x+=(x&(-x)))
			if(V[i]>V[aib[x]])
				aib[x]=i;
		
		}
		
		void write (int i){
			
			if(i){
				write (que[i]);
				printf("%d ",nesrt[i]);
				}
			
			}

int main ()
{
	
	ifstream in ("scmax.in");
	freopen ("scmax.out","w",stdout);
	in>>n;
	for(int i=1;i<=n;++i){
		in>>ind[i];
		nesrt[i]=srt[i]=ind[i];
		}
	sort(srt+1,srt+n+1);
	int m=1;
	for(int i=2;i<=n;++i)
		if(srt[m]!=srt[i])
			srt[++m]=srt[i];
	for(int i=1;i<=n;++i)
		ind[i]=lower_bound(srt+1,srt+m+1,ind[i])-srt;
	for(int i=1;i<=n;++i){
		que[i]=srch(ind[i]-1);
		V[i]=V[que[i]]+1;
		up(ind[i],i);
		}
	int mm=0;
	for(int i=1;i<=n;++i)
		if(V[mm]<V[i])
			mm=i;
	printf("%d\n",V[mm]);
	write (mm);
	printf("\n");
	
	return 0;}