Cod sursa(job #443811)

Utilizator blasterzMircea Dima blasterz Data 18 aprilie 2010 15:05:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <algorithm>

using namespace std;
#define N 100001
#define common int m = (l + r) >> 1, L = n << 1, R = L | 1
#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;
	}
}

int H[3 * N];
int a[N];
int n, m;

void build (int n, int l, int r)
{
	if (l >= r)
	{
		H[n] = a[l];
		return;
	}

	common;

	build (L, l, m);
	build (R, m + 1, r);

	H[n] = max (H[L], H[R]);
}

inline void update (int n, int l, int r, int p, int v)
{
	if (l >= r) 
	{
		H[n] = v;
		return;
	}

	common;

	if (p <= m)
		update (L, l, m, p, v);
	else
		update (R, m + 1, r, p, v);

	H[n] = max (H[L], H[R]);
}


inline int query (int n, int l, int r, int ql, int qr )
{
	if (ql <= l && r <= qr)
		return H[n];

	common;

	int v = 0;

	if (ql <= m)
		v = max (v, query (L, l, m, ql, qr));
	if (qr > m)
		v = max (v, query (R, m + 1, r, ql, qr));

	return v;
}


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

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

	build (1, 1, n);

	int t, p, q;
	while (m--)
	{
		cit (t); cit (p); cit (q);
		if (t == 0)
			printf ("%d\n", query (1, 1, n, p, q));
		else
			update (1, 1, n, p, q);
	}

	return 0;
}