Cod sursa(job #2216742)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 27 iunie 2018 19:46:57
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <conio.h>

using namespace std;

#define MAX_N 100005

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

int n;

struct Node
{
	int accum = 0;
	int minim;
};

Node tree[MAX_N * 4];
int maxAccum = 0;

void Insert(int node, int left, int right, int pos, Node& value)
{
	if (left == right)
	{
		tree[node] = value;
	}
	else
	{
		int middle = (left + right) / 2.0f;

		if(pos <= middle)
		{
			Insert(node * 2, left, middle, pos, value);
		}
		else
		{
			Insert(node * 2 + 1, middle + 1, right, pos, value);
		}

		Node maxNode;

		if (tree[node * 2].accum > tree[node * 2 + 1].accum)
		{
			maxNode = tree[node * 2];
		}
		else
		{
			maxNode = tree[node * 2 + 1];
		}

		tree[node] = maxNode;
	}
}

void Query(int node, int left, int right, int a, int b, int val)
{
	if (a <= left && right <= b)
	{
		if (val > tree[node].minim)
		{
			if (tree[node].accum > maxAccum)
			{
				maxAccum = tree[node].accum;
			}
		}
	}
	else
	{
		int middle = (left + right) / 2.0f;

		if (a <= middle)
		{
			Query(node * 2, left, middle, a, b, val);
		}

		if(b > middle)
		{
			Query(node * 2 + 1, middle + 1, right, a, b, val);
		}
	}
}

int main(void)
{
	fin >> n;

	for (int i = 1; i <= n; i++)
	{
		int value;
		fin >> value;

		Node node;

		if (i == 1)
		{
			node.accum = 0;
		}
		else
		{
			maxAccum = 0;
			Query(1, 1, n, 1, i - 1, value);
			node.accum = maxAccum + 1;
		}

		node.minim = value;
		Insert(1, 1, n, i, node);
	}

	//for (int i = 1; i < 2 * n; i++)
	//{
		//printf("%d ", tree[i].accum);
	//}

	fout << tree[1].accum;

	_getch();

	return 0;
}