Cod sursa(job #481956)

Utilizator marius21Marius Petcu marius21 Data 2 septembrie 2010 09:14:19
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <cstdio>
#include <cstdlib>

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

int v[100000];
int q[100000];
int p[100000];
int nq;

int cautbin(int val, int n)
{
	int pi=0;
	int pf=n-1;
	while (pi<=pf)
	{
		int m = (pi+pf)/2;
		if (v[q[m]]<val)
			pi=m+1;
		else
			pf=m-1;
	}
	return pf+1;
}

int main (int argc, char * const argv[]) {
	int n;
	fscanf(fin, "%d", &n);
	nq=0;
	for (int i=0; i<n; i++)
	{
		fscanf(fin, "%d", &v[i]);
		int poz = cautbin(v[i],nq);
		if (poz>=nq)
			nq=poz+1;
		q[poz] = i;
		p[i]= poz;
	}
	fprintf(fout, "%d\n",nq);
	int i=n-1;
	int onq=nq;
	while ((nq)&&(i>=0))
	{
		if (p[i]==nq)
			q[--nq]=i;
		i--;
	}
	for (int i=0; i<onq; i++)
		fprintf(fout, "%d ",v[q[i]]);
	fclose(fin);
	fclose(fout);
    return 0;
}