Cod sursa(job #1264917)

Utilizator BLz0rDospra Cristian BLz0r Data 16 noiembrie 2014 14:46:49
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
using namespace std;

#define nmax 100002

FILE *f=fopen ("scmax.in","r");
FILE *g=fopen ("scmax.out","w");

int v[nmax],vmin[nmax],D[nmax],prev[nmax],ap[nmax];

int bsearch (int st, int dr, int val){
	int mid;
	
	while (st<=dr){
		mid=(st+dr)>>1;
		if (vmin[mid]<val) st=mid+1;
		else dr=mid-1;
	}
	
	return dr;
}

void remake (int poz){
	if (poz==0) return;
	remake (prev[poz]);
	fprintf (g,"%d ",v[poz]);
}

int main(){
	int n,max=-1,poz,lg=0;
	
	fscanf (f,"%d",&n);
	
	for (int i=1;i<=n;++i) fscanf (f,"%d",&v[i]);
	
	D[1]=1; vmin[1]=v[1]; lg=1;
	
	for (int i=2;i<=n;++i){
		int k=bsearch (1,lg,v[i]);
		D[i]=D[ap[k]]+1;
		prev[i]=ap[k];
		
		if (D[i]>max){
			max=D[i];
			poz=i;
		}
		
		if (vmin[D[i]]>v[i] || vmin[D[i]]==0){
			if (vmin[D[i]]==0) lg++;
			vmin[D[i]]=v[i];
			ap[D[i]]=i;
		}
	}
	
	fprintf (g,"%d\n",max);
	remake (poz);
	
	return 0;
}