Cod sursa(job #2902885)

Utilizator Bogdan197Putineanu Bogdan Bogdan197 Data 16 mai 2022 21:33:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <algorithm>
#include <iostream>

using namespace std;

int valori[100010];
int arb_int[400010];

void buildtree(int node, int left, int right)
{

	if (left == right)
		arb_int[node] = valori[left];
	else
	{
		int middle = (left + right) / 2;
		buildtree(node * 2, left, middle);
		buildtree(node * 2 + 1, middle + 1, right);
		arb_int[node] = max(arb_int[node * 2], arb_int[node * 2 + 1]);
	}
}

int getmax(int node, int tree_left, int tree_right, int interval_left, int interval_right)
{
	if (tree_left > tree_right)
		return -1;
	if (tree_left > interval_right || tree_right < interval_left)		
		return -1;
	if (tree_left >= interval_left && tree_right <= interval_right)
		return arb_int[node];
	int middle = (tree_left + tree_right) / 2;
	return max(getmax(node * 2, tree_left, middle, interval_left, interval_right), getmax(node * 2 + 1, middle + 1, tree_right, interval_left, interval_right));
}

void update(int node, int position, int value, int tree_left, int tree_right)
{
	if (tree_left == tree_right)
	{
		arb_int[node] = value;
		return;
	}
	int middle = (tree_left + tree_right) / 2;
	if (position <= middle)
		update(node * 2, position, value, tree_left, middle);
	else
		update(node * 2 + 1, position, value, middle + 1, tree_right);
	arb_int[node] = max(arb_int[node * 2], arb_int[node * 2 + 1]);
}

int main()
{
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int nr_elemente, nr_operatii, tip_operatie;
	f >> nr_elemente >> nr_operatii;
	for (int i = 1; i <= nr_elemente; i++)
		f >> valori[i];
	
	buildtree(1, 1, nr_elemente);
	int interval_left, interval_right, poz, val;
	for (int i = 0; i < nr_operatii; i++)
	{
		f >> tip_operatie;
		if (tip_operatie == 0)
		{
			f >> interval_left >> interval_right;
			g << getmax(1, 1, nr_elemente, interval_left, interval_right) << "\n";
		}
		else
		{
			f >> poz >> val;
			update(1, poz, val, 1, nr_elemente);
		}
	}
}