Cod sursa(job #186857)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 28 aprilie 2008 20:54:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

const int N_MAX = 100001;

int aint[N_MAX * 5], max;

inline int MAX(int a, int b)
{
	return (a > b ? a : b);
}

void query(int nod, int st, int dr, int a, int b)
{
	if (a <= st && dr <= b) {
		if (aint[nod] > max) max = aint[nod];
	} else {

		int mij = (st + dr) / 2;
		if (a <= mij) query(nod * 2, st, mij, a, b);
		if (mij < b) query(nod * 2 + 1, mij + 1, dr, a, b);
	}
}

void update(int nod, int st, int dr, int poz, int val)
{
	if (st == dr) {
		aint[nod] = val;
	} else {

		int mij = (st + dr) / 2;
		if (poz <= mij) update(nod * 2, st, mij, poz, val);
		else update(nod * 2 + 1, mij + 1, dr, poz, val);

		aint[nod] = MAX(aint[nod * 2], aint[nod * 2 + 1]);
	}
}

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

	int N, M, X;

	scanf("%d %d\n", &N, &M);
	for (int i = 1; i <= N; i ++) {
		scanf("%d ", &X);
		update(1, 1, N, i, X);
	}

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

		if (op == 0) {
			max = -1;
			query(1, 1, N, a, b);
			printf("%d\n", max);
		}
		else update(1, 1, N, a, b); 
	}

	return 0;
}