Cod sursa(job #1350614)

Utilizator cristian.enciuCristian Enciu cristian.enciu Data 20 februarie 2015 21:01:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>

int arb[100010*4];
int max;

void set(int node, int left, int right, int pos, int val)
{
	if(left == right) {
		arb[node] = val;
		return;
	}

	int mid = (left + right)/2;
	if(pos <= mid) set(node * 2, left, mid, pos, val);
	else set(node * 2 + 1, mid + 1, right, pos, val);

	arb[node] = arb[node * 2] > arb[node * 2 + 1] ? arb[node * 2] : arb[node * 2 + 1];
}

void ret(int node, int left, int right, int a, int b)
{
	if(a <= left && right <= b) {
		if(max < arb[node]) max = arb[node];
		return;
	}

	int mid = (left + right) / 2;
	if(a <= mid) ret(node * 2, left, mid, a, b);
	if(mid < b) ret(node * 2 + 1, mid + 1, right, a, b);
}

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

	int n, m;
	scanf("%d%d", &n, &m);
	for(int i = 0 ; i < n ; ++i) {
		int val;
		scanf("%d", &val);

		set(1, 1, n, i + 1, val);
	}

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

		if(type == 1) {
			set(1, 1, n, a, b);
		} else {
			max = -1;
			ret(1, 1, n, a, b);
			printf("%d\n", max);
		}
	}
	return 0;
}