Cod sursa(job #2723642)

Utilizator Rares31100Popa Rares Rares31100 Data 15 martie 2021 11:20:35
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
 
std::ifstream fin("arbint.in");
std::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 = std::max(maxx, tree[st++]);
 
		if(dr % 2 == 0)
			maxx = std::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] = std::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] = std::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;
}