Cod sursa(job #671155)

Utilizator attila3453Geiszt Attila attila3453 Data 30 ianuarie 2012 20:10:01
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#include <fstream>

using namespace std;

int arbore[400001];
int n, m, i, stanga, dreapta, node, val, maxim;

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

void maxinterval(int nod, int l, int r)
{
	if(l >= stanga && r <= dreapta)
	{
		maxim = max(maxim, arbore[nod]);
		return;
	}
	
	int half = (l + r) / 2;
	
	if(node <= half) update(2 * nod, 1, half);
	if(node > half) update(2 * nod + 1, half + 1, r);
}

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	
    scanf("%d %d", &n, &m);
    
    //arbore = new int[2 * n + 2];
    
    for(i = 0;i < n;i++)
    {
		scanf("%d", &val);
		node = i + 1;
		update(1, 1, n);
	}
	
	int q, a, b;
	
	for(i = 0;i < m;i++)
	{
		scanf("%d %d %d", &q, &a, &b);
		
		if(q == 0)
		{
			maxim = -1; stanga = a; dreapta = b;
			maxinterval(1, 1, n);
			printf("%d\n", maxim);
		}
		else
		{
			val = b; node = a;
			update(1, 1, n);
		}
	}
	
    return 0;
}