Cod sursa(job #828955)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 4 decembrie 2012 18:16:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
using namespace std;

int n, m;
int a[262145], inc, sf, val, poz, maxim;

inline int Max(int a, int b)
{
	return (a > b ? a : b);
}

void build(int nod, int stg, int dpt)
{
	if (stg == dpt)
	{
		a[nod] = val;
		return;
	}
	
	int m = (stg+dpt)>>1, fs = nod<<1;
	if (poz <= m) build(fs, stg, m);
	else build(fs+1, m+1, dpt);
	
	a[nod] = Max(a[fs], a[fs+1]);
}

void showMeTheMoney(int nod, int stg, int dpt)
{
	if (inc <= stg && dpt <= sf)
	{
		if (maxim < a[nod]) maxim = a[nod];
		return;
	}
	
	int m = (stg+dpt)>>1, fs = nod<<1;
	if (inc <= m) showMeTheMoney(fs, stg, m);
	if (m < sf) showMeTheMoney(fs+1, m+1, dpt);
}

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int a, b, c, i;
	
	scanf("%d%d", &n, &m);
	for (i=1;i<=n;++i)
	{
		scanf("%d", &c);
		poz = i; val = c;
		build(1, 1, n);
	}
	
	for (i=1;i<=m;++i)
	{
		scanf("%d%d%d", &c, &a, &b);
		if (c)
		{
			poz = a, val = b;
			build(1, 1, n);
		}
		else
		{
			maxim = 0;
			inc = a; sf = b;
			showMeTheMoney(1, 1, n);
			printf("%d\n", maxim);
		}
	}
	return 0;
}