Cod sursa(job #443864)

Utilizator blasterzMircea Dima blasterz Data 18 aprilie 2010 18:13:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
#define N 100001
#define dim 8192
#define common int m = (l + r) >> 1, L = n << 1, R = L | 1

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 n, m;

int H[3 * N];
bool full[3 * N];
int a[N];

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

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

	if (full[L] && full[R] && H[L] == H[R])
		full[n] = 1;
	else
		full[n] = 0;
	H[n] = max (H[L], H[R]);
}

inline void update (int n, int l, int r, int ql, int qr, int v)
{
	if (ql <= l && r <= qr)
	{
		H[n] = v;
		full[n] = 1;
		return;
	}

	common;

	if (full[n] == 1)
	{
		full[L] = full[R] = 1;
		full[n] = 0;
		H[L] = H[R] = H[n];
	}

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

	if (full[L] && full[R] && H[L] == H[R])
		full[n] = 1;
	else
		full[n] = 0;

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

inline int query (int n, int l, int r, int ql, int qr)
{
	if (full[n])
		return H[n];
	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, p, q);

	}

	return 0;
}