Cod sursa(job #749506)

Utilizator IeewIordache Bogdan Ieew Data 17 mai 2012 14:51:56
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#define MAXN 100004
#define INF 1000000
int n;
int a[MAXN];
int l;
int b[MAXN], c[MAXN];

inline int get_middle(int a, int b)
{
	//return  a + (b - a +1) / 2;
	return (a + b) / 2;
}

inline int between(int x, int a, int b)
{	return x>a && x<b;}

FILE *g;

void print_sol(int x)
{
	if(!x) 
		return;
	print_sol(c[x]);
	fprintf(g,"%d ",a[x]);
}

int main()
{
	FILE *f;
	
	f = fopen("scmax.in", "r");
	fscanf(f,"%d",&n);
	int i;
	for(i=1;i<=n;i++)
	{
		fscanf(f,"%d",&a[i]);
	}
	fclose(f);
	a[0] = -INF;
	b[1] = 1;
	c[1] = 0; // predecesor
	
	l = 1;
	int lo, hi, mid;
	for(i=2;i<=n;i++)
	{	
		//printf("i = %d; l = %d\n",i,l);
		if(a[b[l]] < a[i])
		{
			b[l+1] = i;
			c[i] = b[l];
			l++;
			//printf("poz %d creste lung sirului\n",i);
			continue;
		}		
		lo = 1; hi = l;
		while(lo <= hi)
		{
			mid = get_middle(lo, hi);
			//printf("%d %d %d\n", lo, mid, hi);
			if(a[b[mid]] > a[i])
				if(a[i] > a[b[mid-1]])
				{
		//			printf("imbunatatesc sirul de lung %d inlocuind %d cu %d\n", mid, a[b[mid]], a[i]);
					c[i] = b[mid-1];
					b[mid] = i;
					break;
				}
				else hi = mid - 1;
			else lo = mid + 1;
		}			
	}
	g = fopen("scmax.out", "w");
	fprintf(g,"%d\n",l);
	print_sol(b[l]);
	fclose(g);
	//printf("sol: %d\n",l);
	return 0;
}