Cod sursa(job #279209)

Utilizator raula_sanChis Raoul raula_san Data 12 martie 2009 18:41:19
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>

#define MAX_N 200002

long long T[MAX_N];
long long Max;
int N, M;

void Init()
{
	int i;
	for ( i = 1; i < MAX_N; ++i )
		T[i] = 0x3f3f3f3f;
}

void Update(int n, int st, int dr, int poz, long long v)
{
	if(st == dr)
		T[n] = v;

	else
	{
		int m = (st + dr) >> 1;

		if(poz <= m)
			Update(n<<1, st, m, poz, v);
		else
			Update((n<<1)+1, m+1, dr, poz, v);

		T[n] = T[n<<1] > T[(n<<1)+1] ? T[n<<1] : T[(n<<1)+1];
	}
}

void Query(int n, int st, int dr, int a, int b)
{
	if(st >= a && dr <= b)
		Max = T[n] > Max ? T[n] : Max;
	else
	{
		int m = (st + dr) >> 1;

		if(a <= m) Query(n<<1, st, m, a, b);
		if(b > m) Query((n<<1)+1, m+1, dr, a, b);
	}
}

int main()
{
	freopen("arbint.in", "rt", stdin);
	freopen("arbint.out", "wt", stdout);

	int i; long long v;
	for ( scanf("%d %d", &N, &M), Init(), i = 1; i <= N; ++i )
	{
		scanf("%lld", &v);
		Update(1, 1, N, i, v);
	}

	int op, a; long long b;
	for ( i = 1; i <= M; ++i )
	{
		scanf("%d %d %lld", &op, &a, &b);

		if(!op)
		{
			Max = 0;
//			Query(1, 1, N, a, b);

			printf("%lld\n", Max);
		}
		else
			Update(1, 1, N, a, b);
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}