Cod sursa(job #536733)

Utilizator codrut94Ciucanu Codrin codrut94 Data 19 februarie 2011 10:27:35
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
#include<cstdlib>
#define mare 1<<31    // 2 la puterea 31 // ox3fffffff
using namespace std;
typedef int vector[100001];
vector v,p,q;
int *s,n,nq;

void read()
{	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d", &n); 
	for(int i=1;i<=n;++i) scanf("%d", &v[i]);
}

int insbin(int k,int x, int y)
{	int mij=(x+y)/2;
	if(x==y){
		if(y>nq)
			q[++nq+1]=mare;
			q[x]=k;
			return x;
	}
	else if(k<=q[mij]) return insbin(k,x,mij); //
		 else return insbin(k,mij+1,y);
}

void creare_pq()
{	nq=0;q[1]=mare;
	for (int i=1; i<=n; ++i)
		p[i]=insbin(v[i],1,nq+1);
}

void cautsol()
{	int i,k=n;
	s=(int*)calloc(nq+1,sizeof(int));
	for(i=nq;i;--i)
	{	while(p[k]!=i) --k;
		*(s+i)=v[k];
	}
}

void scriu_sol()
{	freopen("scmax.out","w",stdout);
	printf("%d\n", nq);
	for(int i=1;i<=nq;++i) printf("%d ", *(s+i) );
	printf("\n");
}

int main()
{	read();
	creare_pq();
	cautsol();
	scriu_sol();
	return 0;
}