Cod sursa(job #160828)

Utilizator marinaMarina Horlescu marina Data 16 martie 2008 23:17:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
//Arbori de intervale
#include <stdio.h>
#define INPUT "arbint.in"
#define OUTPUT "arbint.out"
#define NMAX 100000

int N, M;
int arbmax[NMAX*3];
int val, pos;
int start, fin, maxim;

inline int max(int a, int b)
{
	if(a > b) return a;
	return b;
}
void update(int nod, int st, int dr)
{
	if(st == dr)
	{
		arbmax[nod] = val;
		return;
	}
	int mij = (st+dr)/2;
	if(pos<=mij) update(nod<<1, st, mij);
	else update((nod<<1)+1, mij+1, dr);
	arbmax[nod] = max(arbmax[nod<<1], arbmax[(nod<<1)+1]);	
}

void query(int nod, int st, int dr)
{
	if(start <=  st && dr <= fin)
	{		
		maxim = max(maxim, arbmax[nod]);
		return;
	}
	int mij = (st+dr)/2;
	if(start<=mij) query(nod<<1, st, mij);
	if(fin>mij) query((nod<<1)+1, mij+1, dr);
}
int main()
{
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);
	
	scanf("%d %d", &N, &M);
	int i;
	for(i = 1; i <= N; ++i)
	{
		scanf("%d", &val);
		pos = i;
		update(1, 1, N);
	}
	for(i = 1; i <= M; ++i)
	{
		int tip, x, y;
		scanf("%d %d %d", &tip, &x, &y);
		if(tip == 0)
		{
			start = x; fin = y; maxim = -1;
			query(1, 1, N);
			printf("%d\n", maxim);
		}
		else
		{
			pos = x; val = y; 
			update(1, 1, N);
		}
	}
	return 0;
}