Cod sursa(job #1246005)

Utilizator PatrikStepan Patrik Patrik Data 20 octombrie 2014 13:10:37
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define MAX 400001
int A[MAX] ;

void update(int n , int l , int r , int poz , int val );
int query(int n , int l , int r ,  int a , int b );
int max(int a , int b);

int main()
{
	int n , m , x , i , t , a , b;

	freopen("arbint.in" , "r" , stdin );
	freopen("arbint.out" , "w" , stdout );

	scanf("%d%d" , &n , &m );

	for(i = 1 ; i <= n ; ++i )
	{
		scanf("%d" , &x);
		update(1,1,n,i,x);
	}

	for(i = 1 ; i <= m ; ++i )
	{
		scanf("%d%d%d", &t , &a , &b);
		if(t == 0)printf("%d\n" , query(1,1,n,a,b));
		else update(1,1,n,a,b);
	}

	return 0;
}

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

void update(int n , int l , int r , int poz , int val )
{
	int mijl = (l+r)/2;

	if(l == r)A[n] = val;
	else
	{
		if(poz <= mijl)update(2*n,l,mijl,poz,val);
		else update(2*n+1,mijl+1,r,poz,val);
		A[n] = max(A[2*n],A[2*n+1]);
	}
}

int query(int n , int l , int r , int a , int b)
{
	int mijl = (l+r)/2 , best = 0;

	if(a <= l && b >= r)return A[n];
	else
	{
		if(a <= mijl)best = query(2*n,l,mijl,a,b);
		if(b > mijl)best = max(best , query(2*n+1,mijl+1,r,a,b));
		return best;
	}
}