Cod sursa(job #261225)

Utilizator oumbraPaul Filimoon oumbra Data 17 februarie 2009 22:58:14
Problema Arbori de intervale Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

#define SIZE_A 100000
int A[4*SIZE_A];

inline int max(int a, int b)
{
	if(a < b)
		return b;
	return a;
}

void insert(int node, int left, int right, int loc, int value)
{
	int m;

	if(left == right)	
	{
		A[node] = value;
	}
	else
	{
		m = (left+right)/2;
		if(loc <= m)
		{
			insert(node*2, left, m, loc, value);
		}
		else
		{
			insert(node*2+1, m+1, right, loc, value);
		}

		A[node] = max(A[2*node], A[2*node+1]);
	}
}

int find(int node, int left, int right, int a, int b)
{
	int x, y, m;
	x = y =0;
	
	if(a <= left && right <= b)
	{
		return A[node];
	}
	else
	{
		m = (left+right)/2;
		
		if(a <= m)
			x = find(2*node, left, m, a, b);
		if(b > m)
			y = find(2*node+1, m+1, right, a, b);

		return max(x, y);
		
	}
}

int main()
{
	int N, M;
	int tmp, i, x, y;
	
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	scanf("%d%d", &N, &M);

	for(i = 1; i <= N; i++)
		scanf("%d", &tmp), insert(1, 1, N, i, tmp);
	
	for(i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &tmp, &x, &y);
		if(tmp == 1)
		{
			insert(1, 1, N,  x, y);
		}
		else
		{
			printf("%d\n", find(1, 1, N, x, y));
		}
	}
	return 0;
}