Cod sursa(job #1248151)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 24 octombrie 2014 18:51:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int arb[(100000 << 2)], val, a, b, res;

void update(int node, int l, int r){
	if (l == r)
		arb[node] = val;

	else{
		int mid = l + ((r - l) >> 1);
		if (a <= mid)
			update((node << 1), l, mid);
		if (mid < b)
			update((node << 1) + 1, mid + 1, r);
		arb[node] = max(arb[(node << 1) + 1], arb[(node << 1)]);
	}
}

void query(int node, int l, int r){
	if (a <= l && b >= r){
		res = max(res, arb[node]);
	}
	else{
		int mid = l + ((r - l) >> 1);
		if (a <= mid)
			query((node << 1), l, mid);
		if (mid < b)
			query((node << 1) + 1, mid + 1, r);
	}
}
int main(){
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int v, n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++){
		scanf("%d", &v);
		val = v;
		a = i;
		b = a;
		update(1, 1, n);
	}
	for (int i = 0; i < m; i++){
		int cmd, begin, end;
		scanf("%d%d%d", &cmd, &begin, &end);
		if (cmd == 1){
			a = begin;
			b = a;
			val = end;
			update(1, 1, n);
		}
		else{
			res = 0;
			a = begin, b = end;
			query(1, 1, n);
			printf("%d\n", res);
		}

	}
	return 0;
}