Cod sursa(job #1741004)

Utilizator Bulgaru_Robert_Razvan_323CBBulgaru Robert Razvan Bulgaru_Robert_Razvan_323CB Data 12 august 2016 18:42:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

unsigned int a[100001];
unsigned int ind[100001];
unsigned int p[100001];
unsigned int best[100001];

unsigned int maxim,nr,pos,x,n;

void print(int i) {
	if (p[i])
		print(p[i]);
	out<<a[i]<<" ";
}

unsigned int search(int x) {
	unsigned int low=0,mid,high=nr;

	while (low<=high) {
		mid=low+(high-low)/2;

		if (a[ind[mid]]<x && a[ind[mid+1]]>=x)
			return mid;
		else if (a[ind[mid+1]]<x)
			low=mid+1;
		else
			high=mid-1;
	}

	return nr;
}

int main() {
	in>>n;
	for (unsigned int i=1;i<=n;i++) {
		in>>a[i];
	}

	nr=1;
	best[1]=ind[1]=1;
	ind[0]=0;

	for (unsigned int i=2;i<=n;i++) {
		pos=search(a[i]);
		p[i]=ind[pos];
		best[i]=pos+1;
		ind[pos+1]=i;

		if (nr<pos+1)
			nr=pos+1;
	}

	maxim=0; pos=0;
	for (unsigned int i=1;i<=n;i++) {
		if (maxim<best[i]) {
			maxim=best[i];
			pos=i;
		}
	}

	out<<maxim<<"\n";
	print(pos);

	return 0;
}