Cod sursa(job #794129)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 5 octombrie 2012 18:36:44
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n, m, valMax, pos, arb[300001];

void Update(int nod, int st, int dr, int poz, int val){
	if (st == dr) {arb[nod] = val; return;}
	int m = (st + dr) / 2;
	if (poz <= m) Update(2*nod, st, m, poz, val);
	else Update(2*nod + 1, m + 1, dr, poz, val);
	arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}

void Query(int nod, int st, int dr, int &first, int &last){
	if (first <= st && dr <= last){
		if (valMax < arb[nod]) valMax = arb[nod]; 
		return;
	}
	int m = (st + dr) / 2;
	if (first <= m) Query(nod * 2, st, m, first, last);
	if (m < last) Query(nod * 2 + 1, m + 1, dr, first, last);
}

int main(){
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	int i, tip, a, b;
	for (i = 1; i <= n; i++) {
		scanf("%d", &a);
		Update(1, 1, n, i, a);
	}
	
	for (i = 0; i < m; i++){
		scanf("%d %d %d", &tip, &a, &b);
		if (tip == 1)	Update(1, 1, n, a, b);
		else {
			valMax = -1;
			Query(1, 1, n, a, b);
			printf ("%d\n", valMax);
		}
	}
}