Cod sursa(job #2723636)

Utilizator Rares31100Popa Rares Rares31100 Data 15 martie 2021 10:59:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, q, *tree, baza;

int maxim(int st, int dr)
{
	st += baza - 1;
	dr += baza - 1;
	int maxx = 0;

	while(st <= dr)
	{
		if(st % 2 == 1)
			maxx = max(maxx, tree[st++]);

		if(dr % 2 == 0)
			maxx = max(maxx, tree[dr--]);

		st /= 2; dr /= 2;
	}

	return maxx;
}

void update(int poz, int val)
{
	poz += baza - 1;
	tree[poz] = val;
	poz /= 2;

	while(poz)
	{
		tree[poz] = max(tree[poz*2], tree[poz*2+1]);
		poz /= 2;
	}
}

int main()
{
	fin >> n >> q;
	baza = 1<<(int)ceil(log2(n));
	tree = new int[baza * 2];

	for(int i = baza; i <= baza + n - 1; i++)
		fin >> tree[i];

	for(int k = baza / 2; k; k /= 2)
		for(int i = k; i <= k * 2 - 1; i++)
			tree[i] = max(tree[i*2], tree[i*2+1]);

	for(int k = 1, cer, a, b; k <= q; k++)
	{
		fin >> cer >> a >> b;
		if(cer == 1)
			update(a, b);
		else
			fout << maxim(a, b) << '\n';
	}

	return 0;
}