Cod sursa(job #1985383)

Utilizator gabib97Gabriel Boroghina gabib97 Data 27 mai 2017 18:57:29
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define M 263000

using namespace std;

int n, m, A[M], mx, x[100001], f[100001];

void build_aint(int k, int a, int b)
{
	if (a == b) A[k] = x[a], f[a] = k;
	else
	{
		int m = (a + b) >> 1;
		build_aint(k<<1, a, m);
		build_aint((k<<1) + 1, m + 1, b);

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

int query(int k, int x, int y, int a, int b)
{
	if (a <= x && y <= b) return A[k];
	else
	{
		int m = (x + y) >> 1;
		int q = -1, w = -1;
		
		if (m >= a) q = query(k<<1, x, m, a, b);
	    if (m < b) w = query((k<<1) + 1, m + 1, y, a, b);

		return max(q, w);
	}
}

void update(int k)
{
	A[k] = max(A[k<<1], A[(k<<1) + 1]);
	if (k) update(k>>1);
}

int main()
{
	freopen ("arbint.in","r",stdin);
	freopen ("arbint.out","w",stdout);
	scanf("%i%i", &n, &m);
	
	int i;
	for (i = 1; i <= n; i++) 
	{
		scanf("%i", &x[i]);
		mx = max(mx, x[i]);
	}

	build_aint(1, 1, mx);
	
	int a, b, p;
	while (m--)
	{
		scanf("%i%i%i", &p, &a, &b);
		if (p == 0)
			printf("%i\n", query(1, 1, mx, a, b));
		else
		{
			A[f[a]] = b;
			update(f[a] >> 1);
		}
	}

	return 0;
}