Cod sursa(job #2216715)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 27 iunie 2018 18:55:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>

#define MAX_N 100005

using namespace std;

FILE* fin;
FILE* fout;

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 = fopen("arbint.in", "r");
	fout = fopen("arbint.out", "w");

	fscanf(fin, "%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &desiredValue);
		
		desiredA = i;
		desiredB = i;

		InsertTree(1, 1, n);
	}

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

		fscanf(fin, "%d %d %d", &task, &a, &b);
		
		if (!task)
		{
			queryResult = -1;

			desiredA = a;
			desiredB = b;

			Query(1, 1, n);

			fprintf(fout, "%d\n", queryResult);
		}
		else
		{
			desiredValue = b;

			desiredA = a;
			desiredB = a;

			InsertTree(1, 1, n);
		}
	}
	
	fclose(fin);
	fclose(fout);

	return 0;
}