Cod sursa(job #1698105)

Utilizator ArkinyStoica Alex Arkiny Data 3 mai 2016 18:13:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;

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

int arb[100000 * 5 + 30];

void update(int el, int x, int y, int val, int k)
{
	int mid = (x + y) / 2;

	if (x == y && el == y)
	{
		arb[k] = val;
		return;
	}
	else if (el <= mid)
		update(el, x, mid, val, k * 2);
	else
		update(el, mid + 1, y, val, k * 2 + 1);
	
	arb[k] = max(arb[k * 2], arb[k * 2 + 1]);
}

int query(int a, int b, int x, int y, int k)
{
	int mid = (x + y) / 2,e1=-1,e2=-1;

	if (x == a && b == y)
		return arb[k];
	
	if (a <= mid)
		e1=query(a, min(b,mid), x, mid, k * 2);

	if (b > mid)
		e2=query(max(mid+1,a), b, mid + 1, y, k * 2 + 1);

	return max(e1, e2);
}

int main()
{
	int N, Q;
	in >> N >> Q;

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

	return 0;
}