Cod sursa(job #1628432)

Utilizator ArkinyStoica Alex Arkiny Data 4 martie 2016 00:36:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
#include<algorithm>
using namespace std;

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

#define MAX 100010

int A[MAX * 4];
int N,M;
void update(int p,int x,int a,int b,int k)
{
	if (a == b && a == p)
		A[k] = x;
	else
	{
		if (p > (a + b) / 2)
			update(p, x, (a + b) / 2 + 1, b, k * 2 + 1);
		else
			update(p, x, a, (a + b) / 2, k * 2);

		A[k] = max(A[k * 2], A[k * 2 + 1]);
	}
}

int query(int a, int b ,int x,int y,int k)
{
	if (a == x && b == y)
		return A[k];
	int e1=0, e2=0;
	if (a <= (x + y) / 2 && b>(x+y)/2)
	{
		e1 = query(a, (x + y) / 2, x, (x + y) / 2, 2 * k);
		e2 = query((x + y) / 2 + 1, b, (x + y) / 2 + 1, y, 2 * k + 1);
	}
	else if(a<=(x+y)/2)
		e1 = query(a, b , x, (x + y) / 2, 2 * k);
	else if(b>(x+y)/2)
		e1 = query(a, b, (x+y)/2+1, y, 2 * k + 1);

	return max(e1, e2);
}

int main()
{

	in >> N >> M;
	for (int i = 1;i <= N;++i)
	{
		int x;
		in >> x;
		
		update(i,x, 1, N, 1);
	}
	for (int i = 1;i <= M;++i)
	{
		int op,a,b;
		in >> op >> a >> b;
		if (op == 0)
			out << query(a, b, 1, N, 1)<<'\n';
		else
		{
			update(a, b, 1, N, 1);
		}
	}

	return 0;
}