Cod sursa(job #614943)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 8 octombrie 2011 09:27:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>

const int DIM = 100005 * 18, OO = (1<<30)-1;
int AI[DIM], N, M, Max, A, B;

int maxim (int a, int b)
{
	return a < b ? b : a;
}

void update (int n, int s, int d)
{
	if (s == d)
	{
		AI[n] = B;
		return;
	}	
	
	int m = (s + d) >> 1, f = n << 1;
	if (A <= m)
		update (f  , s  , m);
	else
		update (f+1, m+1, d);
	
	AI[n] = maxim (AI[f], AI[f+1]);
}

void query (int n, int s, int d)
{
	if (A <= s && d <= B)
	{
		Max = maxim (Max, AI[n]);
		return;
	}
	
	int m = (s + d) >> 1, f = n << 1;
	if (A <= m)
		query (f  , s  , m);
	if (m+1 <= B)
		query (f+1, m+1, d);
}

int main ()
{
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
	
	scanf ("%d%d", &N, &M);
	for (A = 1; A <= N; A++)
	{
		scanf ("%d", &B);
		update (1, 1, N);
	}
	
	for (int i = 0, t; i < M; i++)
	{
		scanf ("%d%d%d", &t, &A, &B);
		if (t == 1)
		{
			update (1, 1, N);
		}			
		else
		{
			Max = -OO;
			query (1, 1, N);
			printf ("%d\n", Max);
		}		
	}
	
	return 0;
}