Cod sursa(job #1606821)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 20 februarie 2016 16:37:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int N, M, ARB[400100], A, B, rs;
void update(int left, int right, int nod, int val, int poz){
	if(left == right) ARB[nod] = val;
		else{
			int pivot = (left + right)/2;
			if(poz <= pivot) update(left, pivot, 2*nod, val, poz);
				else update(pivot+1, right, 2*nod + 1, val ,poz);
			ARB[nod] =max(ARB[2*nod], ARB[2*nod+1]);
			}
}
void query(int left, int right, int nod, int x, int y){
	if(left >= x && right <= y) rs = max(rs, ARB[nod]);
		else {
			int pivot = (left+right)/2;
			if(x <= pivot) query(left, pivot, 2*nod, x, y);
			if(y > pivot) query(pivot+1, right, 2*nod + 1, x, y);
			}
}
int main(){
	cin >> N >> M;
	for(int i = 1; i <= N; i++){
		int x;
		cin >> x;
		update(1,N,1,x,i);
	}
	for(int i = 1; i <= M; i++){
		int X;
		cin >> X >> A >> B;
		if(X == 0){
			rs = -2;
			query(1, N, 1, A, B);
			cout << rs << '\n';
			}
		else update(1, N, 1, B, A);
		}
	return 0;
}