Cod sursa(job #1823116)

Utilizator dodgerblueBogdan P. dodgerblue Data 5 decembrie 2016 22:25:58
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.91 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int *v, *q, *p;

int bs(int st, int dr, int val) {
	int last = 0, med;

	while(st <= dr) {
		med = (st + dr) / 2;
		if(q[med] < val) {
			last = med;
			st = med + 1;
		} else {
			dr = med - 1;
		}
	}
	return last + 1;
}

int main()
{
	int n, i, st, dr, aux;

	FILE *f = fopen("scmax.in", "r");
	FILE *g = fopen("scmax.out", "w");

	fscanf(f,"%d\n",&n);

	v = (int*)malloc((n+1)*sizeof(int));
	q = (int*)malloc((n+1)*sizeof(int));
	p = (int*)malloc((n+1)*sizeof(int));

	for(i = 0; i < n; i++) {
		fscanf(f,"%d ",&v[i]);
		aux = bs(st, dr, v[i]);

		if(aux == dr + 1)
			++dr;

		q[aux] = v[i];
		p[i] = aux;
	}

	fprintf(g, "%d\n", dr);
	aux = dr;

	for (i = n; i >= 1; i--)
		if (p[i] == aux) {
			q[aux] = v[i];
			--aux;
		}

	for (i = 1; i <= dr; i++) {
		fprintf(g, "%d ", q[i]);
	}
	fprintf(g, "\n");

	fclose(f);
	fclose(g);
	free(v);
	free(q);
	free(p);

	return 0;
}