Cod sursa(job #2722631)

Utilizator zerolightningIon Bobescu zerolightning Data 13 martie 2021 08:49:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;


int N, M;
int tree[4 * 100001 + 100];

void update(int, int, int);
void query(int, int, int);

int intervalStart, intervalEnd, maximum;
int intervalPosition, value;

int main()
{
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	// Program
	f >> N >> M;
	for (int i = 1; i <= N; i++)
	{
		f >> value;
		intervalPosition = i;
		update(1, 1, N);
	}
	for (int i = 0; i < M; i++)
	{
		int c, a, b;
		f >> c >> a >> b;
		// Query
		if (c == 0)
		{
			maximum = -1;
			intervalStart = a;
			intervalEnd = b;
			query(1, 1, N);
			g << maximum << '\n';
		}
		// c == 1
		else
		{
			intervalPosition = a;
			value = b;
			update(1, 1, N);
		}
	}

	// Exit
	f.close();
	g.close();
	return 0;
}

void update(int treePos, int treeStart, int treeEnd)
{
	if (treeStart == treeEnd)
	{
		tree[treePos] = value;
		return;
	}
	
	int mij = (treeStart + treeEnd) / 2;
	if (intervalPosition <= mij)
		update(2 * treePos, treeStart, mij);
	else
		update(2 * treePos + 1, mij + 1, treeEnd);

	tree[treePos] = max(tree[2 * treePos], tree[2 * treePos + 1]);
}

void query(int treePos, int treeStart, int treeEnd)
{
	if (intervalStart <= treeStart && treeEnd <= intervalEnd)
	{
		maximum = max(maximum, tree[treePos]);
		return;
	}

	int mij = (treeStart + treeEnd) / 2;
	if (intervalStart <= mij) query(2 * treePos, treeStart, mij);
	if (mij + 1 <= intervalEnd) query(2 * treePos + 1, mij + 1, treeEnd);
}