Cod sursa(job #1751289)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 1 septembrie 2016 09:27:17
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <string.h>
#include <limits.h>

#define MAX_DIM_TREE 262150 // 2^18 - 1
#define MAX_DIM_VECT 100001
using namespace std;

void Initialise(int n, int &treeDim, int *tree, int *parentVect);
void Process(int n, int treeDim, int &max, int* tree, int* parentVect, istream &fin);
void Update (int pos, int x, int treeDim, int &max, int* tree, int* parentVect);

int main()
{
	int treeDim;
	int tree[MAX_DIM_TREE];
	int parentVect[MAX_DIM_VECT];
	int n, max;

	ifstream fin;
	ofstream fout;
	fout.open("scmax.out");
	fin.open("scmax.in");
	fin >> n;

	Initialise(n, treeDim, tree, parentVect);

	Process(n, treeDim, max, tree, parentVect, fin);

	fout << max << "\n";
	for(int i = 0; i < max; i++)
	{
		fout << parentVect[i] << " ";
	}

	fin.close();
	fout.close();
	return 0;
}

void Initialise(int n, int &treeDim, int *tree, int *parentVect)
{
	treeDim = 1;
	int exp = 1;
	while(exp < n)
	{
		exp *= 2;
		treeDim += exp;
	}

	for(int i = 1; i <= treeDim +1; i++)
	{
		tree[i] = INT_MAX;
	}
	memset(parentVect, 0, MAX_DIM_VECT * sizeof(int));
}

void Process (int n, int treeDim, int &max, int* tree, int* parentVect, istream &fin)
{
	int x;
	for(int i = 0; i < n; ++i)
	{
		fin >> x;
		Update(1, x, treeDim, max, tree, parentVect);
	}
}

void Update (int pos, int x, int treeDim, int& max, int* tree, int* parentVect)
{
	if(2 * pos > treeDim && x <= tree[pos])
	{
		tree[pos] = x;
		if(tree[pos + 1] == INT_MAX)
		{
			//memcpy((void*)parentVect, (tree + treeDim / 2 + 1), treeDim / 2 + 1 * sizeof(int));
			max = pos - treeDim / 2;
		}

		return;
	}

	if(tree[2*pos] >= x)
	{
		Update(2 * pos, x, treeDim, max, tree, parentVect);
	}
	else
	{
		Update(2 * pos + 1, x, treeDim, max, tree, parentVect);
		tree[pos] = tree[2 * pos + 1];
	}
}