Cod sursa(job #602933)

Utilizator Catah15Catalin Haidau Catah15 Data 13 iulie 2011 19:05:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>

using namespace std;

#define maxN 100005

int sol;
int Aint[maxN * 3];


void update (int nod, int st, int dr, int a, int b)
{
	if (st == dr)
	{
		Aint[nod] = b;
		return;
	}
	
	int mid = (st + dr) / 2;
	
	if (a <= mid) update (nod * 2, st, mid, a, b);
	else update (nod * 2 + 1, mid + 1, dr, a, b);
	
	Aint[nod] = max (Aint[nod * 2], Aint[nod * 2 + 1]);
}



void query (int nod, int st, int dr, int a, int b)
{
	if (st >= a && dr <= b)
	{
		sol = max (sol, Aint[nod]);
		return;
	}
	
	int mid = (st + dr) / 2;
	
	if (mid >= a) query (nod * 2, st, mid, a, b);
	if (mid < b) query (nod * 2 + 1, mid + 1, dr, a, b);
}



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