Cod sursa(job #762008)

Utilizator Marius96Marius Gavrilescu Marius96 Data 28 iunie 2012 12:05:24
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#define LEN 131072
int t[LEN];
int n;

int f (int x, int y)
{
	return x>y?x:y;
}

void _update (int n, int s, int e, int x, int val)
{
	if(s==e){
		t[n]=val;
		return;
	}
	int m=(s+e)/2;
	//2*n covers s — m
	//2*n+2 covers m+1 — e
	if(x<=m)//go left
		_update (2*n+1, s, m, x, val);
	else
		_update (2*n+2, m+1, e, x, val);
	t[n]=f (t[2*n+1],t[2*n+2]);
}

void update (int x, int val)
{
	_update (0, 0, n-1, x, val);
}

int _query (int n, int s, int e, int x, int y)
{
	if(s>=x&&y>=e)
		return t[n];
	int m=(s+e)/2;
	if(x<=m&&y>m)//x — y cuts both intervals -> go both ways
		return f (
			_query (2*n+1, s, m, x, y),
			_query (2*n+2, m+1, e, x, y)
			);
	if(y<=m)//x — y cuts only left interval -> go left
		return _query (2*n+1, s, m, x, y);
	if(x>m)//x — y cuts only right interval -> go right
		return _query (2*n+2, m+1, e, x, y);
	return -424242;
}

int query (int x,int y)
{
	return _query (0, 0, n-1, x, y);
}

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

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

	while(m--){
		int o,a,b;
		scanf ("%d%d%d",&o,&a,&b);
		if(o)
			update (a-1,b);
		else
			printf ("%d\n", query (a-1,b-1));
	}

	return 0;
}