Cod sursa(job #1131622)

Utilizator PlatonPlaton Vlad Platon Data 28 februarie 2014 22:23:39
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define maxn 100005

int arb[4*maxn+5];
int n, m, st, dr, pos, mx, val;

void update(int nod, int l, int r)
{
	if (l!=r)
	{
		int mij = (l+r)/2;
		if (pos <= mij)
			update(2*nod,l,mij);
		else
			update(2*nod+1,mij+1,r);

		arb[nod] = max(arb[2*nod], arb[2*nod+1] );
	}
	else
	{
		arb[nod] = val;
	}
}

void query(int nod, int l, int r)
{
	if(st<=l && dr>=r)
	{
		if(mx<arb[nod])
		{
			mx=arb[nod];
			return;
		}
	}

	int mij = (l+r/2);
	if(st<=mij)
		query(2*nod, st, mij);
	if(dr>mij)
		query(2*nod+1, mij+1, dr);
}

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

	scanf("%d%d", &n, &m);
	int x;
	for(int i=1;i<=n;i++)
	{
		scanf("%d", &x);
		pos = i;
		val = x;
		update(1, 1, n);
	}

	int a, b;

	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d", &x, &a, &b);

		if(!x)
		{
			mx=-1;
			st = a;
			dr = b;
			query(1, 1, n);

			printf("%d\n", mx);
		}
		else
		{
			pos = a;
			val = b;
			update(1, 1, n);
		}
	}

	return 0;
}