Cod sursa(job #2722627)

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

using namespace std;


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

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

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

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

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

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

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

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