Cod sursa(job #566142)

Utilizator marius21Petcu Marius marius21 Data 28 martie 2011 18:06:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cstdio>
#include <cstdlib>
#include <list>

using namespace std;

FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");

int a[100000];
int v[100000];
int t[100000];

int cautbin(int st, int en, int x)
{
	while (st<=en)
	{
		int m = (st+en)/2;
		if (a[v[m]]<x)
			st=m+1;
		else
			en=m-1;
	}
	return st;
}

int main (int argc, char * const argv[]) {
	int n;
	fscanf(fin, "%d\n",&n);
	for (int i=0; i<n; i++)
		fscanf(fin, "%d",&a[i]);
	int sn = 0;
	for (int i=0; i<n; i++)
	{
		int pos = cautbin(0,sn-1,a[i]);
		v[pos] = i;
		t[i]=pos?v[pos-1]:-1;
		if (pos>=sn)
			sn=pos+1;
	}
	int val = v[sn-1];
	fprintf(fout, "%d\n",sn);
	list<int> q;
	while(val!=-1)
	{
		q.push_back(a[val]);
		val=t[val];
	}
	while (!q.empty())
	{
		fprintf(fout, "%d ",q.back());
		q.pop_back();
	}
	fclose(fin);
	fclose(fout);
    return 0;
}