Cod sursa(job #582684)

Utilizator pykhNeagoe Alexandru pykh Data 15 aprilie 2011 18:18:19
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<cstdio>
#include<algorithm>
using namespace std;


const char in[]="arbint.in";
const char out[]="arbint.out";

const int Max_N = 100005;

int arb[Max_N * 2], a, b, op, poz, maxim, val, N, M, x, y;

void update(int nod, int lo, int hi)
{
	if(lo == hi)
	{
		arb[nod] = val;
		return;
	}
	
	int mid = lo + ( hi - lo) /2;
	if( poz <= mid ) update(2 * nod, lo, mid);
	else update( 2 * nod + 1 , mid + 1, hi);
	arb[nod] = max(arb[2 * nod], arb[ 2 * nod + 1]);
}
		
void querry(int nod, int lo, int hi)
	{
		if(a <= lo && hi <= b)
		{
			maxim = max( maxim, arb[nod]);
			return;
		}
		int mid = lo + (hi - lo) /2;
		if(mid < b)querry(2 * nod + 1, mid + 1, hi);
		if(a <= mid) querry(2 * nod, lo, mid);
		
}
		

int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		
		scanf("%d %d", &N, &M);
		
		for(int i = 1 ; i <= N ; ++i)
		{
			scanf("%d", &x);
			poz = i; val = x;
			update(1, 1, N);
		}
	
		for(int i = 1 ; i <= M ; ++i)
		{
			scanf("%d %d %d", &op, &x, &y);
			
			if(!op)
			{
				a = x, b = y;
				maxim = -1;
				querry(1, 1, N);
				printf("%d\n", maxim);
			}
			else
			{
				poz = x, val = y;
				update(1, 1, N);
			}
		}
		return 0;
}