Cod sursa(job #2065153)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 13 noiembrie 2017 15:13:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
using namespace std;

const int nmax = 524288;
int ai[nmax];

void up(int nod, int left, int right, int index, int val)
{
	if(left == right)
	{
		ai[nod] = val;
		return;
	}
	
	int mid = left + (right - left) / 2;
	
	if(index <= mid)
	{
		up(2 * nod + 1, left, mid, index, val);
	}
	else
	{
		up(2 * nod + 2, mid + 1, right, index, val);
	}
	
	ai[nod] = max(ai[2 * nod + 1], ai[2 * nod + 2]);
}

int query(int nod, int left, int right, int l, int r)
{
	if(l <= left && right <= r)
	{
		return ai[nod];
	}
	
	int mid = left + (right - left ) / 2;
	int ans = -1;
	
	if(l <= mid)
	{
		ans = max(ans, query(2 * nod + 1, left, mid, l, r));
	}
	if(mid < r)
	{
		ans = max(ans, query(2 * nod + 2, mid + 1, right, l, r));
	}
	return ans;
}

int main()
{
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	
	int n, m;
	in >> n >> m;
	
	for(int i = 0;i < n;++i)
	{
		int nr;
		in >> nr;	
		up(0, 0, n - 1, i, nr);
	}
	
	for(int i = 0;i < m;++i)
	{
		int op;
		in >> op;
		
		if(op == 0)
		{
			int a, b;
			in >> a >> b;
			--a, --b;
			out << query(0, 0, n - 1, a, b) << "\n";
		}
		else
		{
			int index, val;
			in >> index >> val;
			
			--index;
			up(0, 0, n - 1, index, val);
		}
	}
	in.close();
	out.close();
}