Cod sursa(job #815398)

Utilizator LorienNedelcu Ana-Florentina Lorien Data 16 noiembrie 2012 21:58:31
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.85 kb
#include<stdio.h>
#define N 1000000
int v[N], pu[N], prec[N];
FILE *f, *g; 

int binary(int l1,int l2, int x) {
	int m;
	while(l1<=l2) { 
		m = (l1+l2)/2;
		if((x < v[pu[m]] && x > v[pu[m-1]]))
			return m;
		else
			if(x > v[pu[m]])
				l1 = m+1;
			else
				l2 = m-1;
	}
	return l2+1;
}

void print(int i) {
	if(prec[i])
		print(prec[i]);
	fprintf(g,"%d ",v[i]);
	}

int main(int argc, char* argv[2]) {
	
	f = fopen("scmax.in","r");	
	g = fopen("scmax.out","w");
	int lmax, i, k, n;
	lmax = 0;
	
	//citirea datelor de intrare
	fscanf(f, "%d", &n);
	for(i=1;i<=n;i++)
		fscanf(f, "%d", &v[i]);
	
	lmax = 0;
	pu[0] = 0;
	for(i=1;i<=n;i++) {
		k = binary(1,lmax,v[i]);
		pu[k] = i;
		prec[i] = pu[k-1];
		if(k > lmax)
			lmax = k;
	}
	fprintf(g,"%d\n",lmax);
	print(pu[lmax]);	
	fclose(f);
	fclose(g);
	return 0;
}