Cod sursa(job #2216714)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 27 iunie 2018 18:51:08
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>

#define MAX_N 100005

using namespace std;

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

int n;
int m;

int tree[4 * MAX_N + 100] = { 0 };

int desiredValue;
int queryResult = -1;

int desiredA;
int desiredB;

inline int Max(int a, int b)
{
	if (a > b)
		return a;

	return b;
}

void InsertTree(int node, int left, int right)
{
	if (left == right)
	{
		tree[node] = desiredValue;
	}
	else
	{
		int middle = (left + right) / 2;
		if (desiredA <= middle)
		{
			InsertTree(node * 2, left, middle);
		}
		else
		{
			InsertTree((node * 2) + 1, middle + 1, right);
		}

		tree[node] = Max(tree[node * 2], tree[(node * 2) + 1]);
	}
}

void Query(int node, int left, int right)
{
	if (desiredA <= left && right <= desiredB)
	{
		queryResult = Max(queryResult, tree[node]);
	}
	else
	{
		int middle = (left + right) / 2;
		if (desiredA <= middle)
		{
			Query(node * 2, left, middle);
		}

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

int main(void)
{
	fin >> n >> m;

	for (int i = 1; i <= n; i++)
	{
		fin >> desiredValue;
		
		desiredA = i;
		desiredB = i;

		InsertTree(1, 1, n);
	}

	for (int i = 1; i <= m; i++)
	{
		int task;
		int a, b;

		fin >> task >> a >> b;

		if (!task)
		{
			queryResult = -1;

			desiredA = a;
			desiredB = b;

			Query(1, 1, n);

			fout << queryResult << endl;
		}
		else
		{
			desiredValue = b;

			desiredA = a;
			desiredB = a;

			InsertTree(1, 1, n);
		}
	}
	
	return 0;
}