Cod sursa(job #513160)

Utilizator ZethpixZethpix Zethpix Data 15 decembrie 2010 11:16:45
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<stdio.h>
#include<stdlib.h>
int v[200000],q[200000],p[200000],m,n,i,k,j,s[200000];
int srch(int x)
{
	int j,st,dr;
	st=0;dr=m;
	while(st!=dr)
	{
		j=(st+dr)/2;
		if(q[j]<x)st=j+1;
		else dr=j;
	}
	return st;
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",&v[i]);
	q[0]=v[0];
	p[0]=0;
	m=0;
	for(i=1;i<n;i++)
	{
		if(q[m]<v[i]){q[++m]=v[i];p[i]=m;continue;}
		j=srch(v[i]);
		q[j]=v[i];
		p[i]=j;
	}
	printf("%d\n",m+1);
	j=n;i=m;k=m;
	while(i>=0)
	{
		while(p[j]!=i)j--;
		s[k--]=v[j];
		i--;
	}
	for(i=0;i<=m;i++)printf("%d ",s[i]);
	printf("\n");
	for(i=0;i<=m;i++)printf("%d ",q[i]);printf("\n");
	for(i=0;i<n;i++)printf("%d ",p[i]);
	return 0;
}