Cod sursa(job #1268351)

Utilizator test9cosmin Macovei test9 Data 20 noiembrie 2014 21:12:24
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<cstdio>
#include<cstdlib>
#define mare 1<<31-1;
using namespace std;
typedef int vector[100010];
vector v,p,q;
int *s;
int n,nq;
void citire(){
	freopen("scmax.in","rt",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",&v[i]);
}
int ins_bin(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 ins_bin(k,x,mij);
		else
			return ins_bin(k,mij+1,y);
}
void creare_pq(){
	nq=0;
	q[1]=mare;
	for(int i=1;i<=n;++i)
		p[i]=ins_bin(v[i],1,nq+1);
}
void caut_sol(){
	int i,k=n;
	s=(int*)calloc(nq,sizeof(int));
	for(i=nq;i;--i){
		while(p[k]!=i) --k;
		*(s+i)=v[k];
	}
}
void scriu_sol(){
	freopen("scmax.out","wt",stdout);
	printf("%d\n",nq);
	for(int i=1;i<=nq;++i)
		printf("%d\n",*(s+i));
}
int main(){
	citire();
	creare_pq();
	caut_sol();
	scriu_sol();
	return 0;
}