Cod sursa(job #761255)

Utilizator igsifvevc avb igsi Data 25 iunie 2012 11:45:14
Problema Subsir crescator maximal Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#define MAX_TREE 262144
#define MAX_LENGTH 100001

int n, seq[MAX_LENGTH], best[MAX_LENGTH], predecessor[MAX_LENGTH], tree[MAX_TREE];
int position;
int max, ll, rr, value;

void update(int l, int r, int v)
{
	if(l == r)
	{
		tree[v] = position;
	}
	else
	{
		int middle = (r - l) / 2 + l;
		if(position <= middle) update(l, middle, 2 * v);
		else update(middle + 1, r, 2 * v + 1);
		
		if(best[ tree[2 * v] ] < best[ tree[2 * v + 1] ])
			tree[v] = tree[2 * v + 1];
		else 
			tree[v] = tree[2 * v];
	}
}

void querry(int l, int r, int v)
{
	if(ll <= l && r <= rr && seq[ tree[v] ] < value)
	{
		if(best[max] < best[tree[v]])
			max = tree[v];
	}
	else if (l < r)
	{
		int middle = (r - l) / 2 + l;
		if(ll <= middle) querry(l, middle, 2 * v);
		if(middle < rr) querry(middle + 1, r, 2 * v + 1);
	}
}

void print(FILE *file, int pos)
{
	if(predecessor[pos] != 0)
		print(file, predecessor[pos]);
	fprintf(file, "%d ", seq[pos]);
}

int main()
{
	FILE *in = fopen("scmax.in", "r");
	FILE *out = fopen("scmax.out", "w");
	int i, maxSeq = 0, maxPos;
	
	fscanf(in, "%d", &n);
	for(i = 1; i <= n; i++)
		fscanf(in, "%d", &seq[i]);
	
	for(i = 1; i <= n; i++)
	{
		position = i;
		value = seq[i];
		ll = 1;
		rr = i - 1;
		max = 0;
		querry(1, n, 1);
		best[i] = best[max] + 1;
		predecessor[i] = max;
		
		if(best[i] > maxSeq)
		{
			maxSeq = best[i];
			maxPos = i;
		}
		
		update(1, n, 1);
	}
	
	fprintf(out, "%d\n", maxSeq);
	print(out, maxPos);
	fprintf(out, "\n");
	
	fclose(in);
	fclose(out);
	return 0;
}