Cod sursa(job #1480042)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 1 septembrie 2015 22:11:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int n,m;
int a[100001];
int segmentTree[200001];
int operation, leftLimitOfInterval , rightLimitOfInterval, position, value, x, y;

void initializeSegmentTree(int node, int left, int right){
	
	if (left==right){
		segmentTree[node] = a[left];
	}
	else
	{
		int middle = (left+ right)/2;
		initializeSegmentTree(2*node, left, middle);
		initializeSegmentTree(2*node+1, middle+1, right);
		segmentTree[node] = max(segmentTree[2*node], segmentTree[2*node+1]);
	}
	return;
}

int maxOnInterval(int node, int left, int right){
	if (left>=leftLimitOfInterval && right<=rightLimitOfInterval) return segmentTree[node];
	else {
		int middle = (left + right)/2;
		if (middle+1>rightLimitOfInterval) return maxOnInterval(2*node, left, middle);
		else if (middle<leftLimitOfInterval) return maxOnInterval(2*node+1, middle+1, right);
		else return max(maxOnInterval(2*node, left, middle), maxOnInterval(2*node+1, middle+1, right));
	}

}

void updateElement(int node, int left, int right){

	if (left==right) segmentTree[node] = value;
	else{
		int middle = (left + right)/2;
		if (position<=middle) updateElement(2*node, left, middle);
		else updateElement(2*node+1, middle+1, right);
		segmentTree[node] = max(segmentTree[2*node], segmentTree[2*node+1]);	
	}

	return;	
}


int main(void){
	
	in >> n >> m;
	for (int i=1; i<=n; i++) in >> a[i];
	initializeSegmentTree(1, 1, n);
	for (int i = 0; i<m; i++){
		in >> operation >> x >> y;
		if (operation == 0) {
			leftLimitOfInterval = x;
			rightLimitOfInterval = y;
			out << maxOnInterval(1, 1, n) << "\n";
		}
		else{
			position = x;
			value = y;
			updateElement(1,1,n);
		} 
	}
	
	return 0;
	
}