Cod sursa(job #3143574)

Utilizator sireanu_vladSireanu Vlad sireanu_vlad Data 31 iulie 2023 14:39:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <vector>
using namespace std;

const int NMAX = 1e5;
int n, m;

int arraySize = 1;
vector<int> arbint;

void update(int pos, int val)
{
	int i = pos + arraySize - 1;
	arbint[i] = val;

	do
	{
		i >>= 1;
		arbint[i] = max(arbint[2*i], arbint[2*i+1]);
	}
	while(i > 0);
}

int query(int nod, int st, int dr, int stQ, int drQ)
{
	if(stQ <= st && dr <= drQ)
		return arbint[nod];

	int mid = (st + dr) / 2;
	int aux = 0;

	if(stQ <= mid)
		aux = max(aux, query(2 * nod, st, mid, stQ, drQ));
	if(mid < drQ)
		aux = max(aux, query(2 * nod + 1, mid + 1, dr, stQ, drQ));

	return aux;
}

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	cin >> n >> m;
	while(arraySize < n) arraySize <<= 1;
	arbint.resize(2*arraySize, 0);

	for(int i = arraySize; i < n + arraySize; ++i)
		cin >> arbint[i];

	for(int i = arraySize-1; i > 0; i--)
		arbint[i] = max(arbint[2*i], arbint[2*i+1]);

	bool t;
	int a, b;
	while(m--)
	{
		cin >> t >> a >> b;
		if(t) update(a, b);
		else cout << query(1, 1, arraySize, a, b) << '\n'; 
	}
}