Cod sursa(job #682045)

Utilizator attila3453Geiszt Attila attila3453 Data 18 februarie 2012 15:05:59
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>
#define max(a, b) (a > b) ? a : b

int sir[400001], st, dr, node, val, maxim;

void update(int nod, int l, int r)
{
	if(l == r)
	{
		sir[nod] = val;
		return;
	}
	
	int half = (l + r) / 2;
	
	if(node <= half) 
		update(2 * nod, 1, half);
	else
		update(2 * nod + 1, half + 1, r);
	
	sir[nod] = max(sir[2 * nod + 1], sir[2 * nod]);
}

void maxint(int nod, int l, int r)
{
	if(l >= st && r <= dr)
	{
		maxim = max(maxim, sir[nod]);
		return;
	}
	
	int half = (l + r) / 2;
	
	if(st <= half)
		maxint(2 * nod, 1, half);
	
	if(dr >= half + 1)
		maxint(2 * nod + 1, half + 1, r);
}

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	
	int n, m, i, a, b, q;
	
	scanf("%d %d", &n, &m);
	
	for(i = 0;i < n;i++)
	{
		scanf("%d", &val);
		node = i + 1;
		update(1, 1, n);
	}
	
	for(i = 0;i < m;i++)
	{
		scanf("%d %d %d", &q, &a, &b);
		
		if(q)
		{
			val = b;
			node = a;
			update(1, 1, n);
		}
		else
		{
			maxim = 0;
			st = a;
			dr = b;
			maxint(1, 1, n);
			printf("%d\n", maxim);
		}
	}
	
	return 0;
}