Cod sursa(job #491297)

Utilizator blasterzMircea Dima blasterz Data 10 octombrie 2010 20:51:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
// @author: Mircea Dima

#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];
bool updated[N];
int n, m;

int query  (int, int );
int query2 (int, int );

inline void lazyUpdate (int p)
{
	
	aib[p] = max (a[p], query2 (p - bit (p) + 1, p - 1));
	updated[p] = 1;

}


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 int query2 (int l, int r)
{
	int i;	
	int ret = 0;

	for (i = r; i >= l; )
	{
		
		if (updated[i] == 0)
			lazyUpdate (i);

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

	return ret;


}

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

	lazyUpdate (p);

	for (p += bit (p); p <= n; p += bit (p))
		updated[p] = 0;
}
inline void update (int p, int v)
{
	a[p] = v;
	int i;
		

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

}

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

	lazyUpdate (p);
	//aib[p] = max (a[p], query (p - bit (p) + 1, p - 1));

//	p += bit (p);

	//if (p <= n)
	//	aib[p] = max (aib[p], a[p]);

}



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

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

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


	int i;
	
	for (i = 1; i <= n; ++i)
		updated[i] = 1;

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

		cit (a[i]);

		build (i, a[i]);
		//update2 (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
		//	build (p, q);
			update (p, q);

	}
	

	return 0;
}