Cod sursa(job #491231)

Utilizator blasterzMircea Dima blasterz Data 10 octombrie 2010 19:17:20
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

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

using namespace std;

#define dim 8192
char ax[dim];
int pz;

inline void cit (int &x)
{
	x = 0;
	while (ax[pz] < '0' || ax[pz] > '9')
		if (++pz == dim)
			fread (ax, 1, dim, stdin), pz = 0;

	while (ax[pz] >= '0' && ax[pz] <= '9')
	{
		x = x * 10 + ax[pz] - '0';
		if (++pz == dim)
			fread (ax, 1, dim, stdin), pz = 0;
	}
}

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))
		if (aib[i] > v)
			aib[i] =  max (a[i], query (i - bit (i) + 1, i - 1));
		else
			aib[i] = v;

}

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

	for (i = p; i <= p + bit (p); ++i)
		if (aib[i] > v)
			aib[i] = max (a[i], query (i - bit (i) + 1, i - 1));
		else
			aib[i] = v;
}


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

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

	//n = 100000;
	//m = 100000;


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

		cit (a[i]);

		build (i, a[i]);
		//update (i, a[i]);
	}

	int t, p, q;

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

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

	}
	

	return 0;
}