Cod sursa(job #491169)

Utilizator blasterzMircea Dima blasterz Data 10 octombrie 2010 14:36:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

#define bit(i) (i & -i)

using namespace std;

const int N = 100007;


int aib[N];
int a[N];
int n, m;

inline int query (int l, int r)
{
	int i;

	int ret = 0;

	for (i = r; i >= l; )
		if (i - bit (i) + 1 >= l)
			ret = max (ret, aib[i]),
			i -=  bit (i);
		else
			ret = max (ret, a[i--]);
	return  ret;
}


inline void update (int p, int v)
{
	a[p] = v;
	int i;
		

	for (i = p; i <= n; i += bit (i))
		aib[i] =  max (a[i], query (i - bit (i) + 1, i - 1));

}

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

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

	int i;
	
	for (i = 1; i <= n; ++i)
	{
		scanf ("%d ", &a[i]);

		update (i, a[i]);
	}

	int t, p, q;

	while (m--)
	{
		scanf ("%d %d %d\n", &t, &p, &q);

		if (t == 0)
			printf ("%d\n", query (p, q));
		else
			update (p, q);

	}
	

	return 0;
}