Cod sursa(job #806503)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 2 noiembrie 2012 22:40:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

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

class maxSegmentTree{
	int *data;
	int size;
	int n;
public:
	maxSegmentTree(int x){
		n=x;
		int log,aux;
		//for(aux=1;aux<=n;aux<<=1,log++);
		//log--;
		log=10;
		data=new int[n*log];
		for(int i=1;i<n*log;++i){
			data[i]=-1;
		}
	}
private:
	int getMax(int l,int r,int a,int b,int poz){
		int result=-1;
		int m=(l+r)/2;
		if(l>=a&&r<=b)
			return data[poz];
		if(m<b){
			result=max(result,getMax(m+1,r,a,b,2*poz+1));
		}
		if(m>=a){
			result=max(result,getMax(l,m,a,b,2*poz));
		}
		return result;
	}
	bool updateVal(int l,int r,int poz,int index,int val){
		int m=(l+r)/2;
		if(l==r && l==index){
			data[poz]=val;
			return true;
		}
		if(m>=index){
			updateVal(l,m,2*poz,index,val);
		}
		else{
			updateVal(m+1,r,2*poz+1,index,val);
		}
		data[poz]=max(data[2*poz],data[2*poz+1]);
	}
public:
	int query(int l,int r){
		return getMax(1,n,l,r,1);
	}
	bool update(int position,int value){
		return updateVal(1,n,1,position,value);
	}
};

int main(){
	int n,m;
	maxSegmentTree *st;
	in>>n>>m;
	st=new maxSegmentTree(n);
	int op,a,b;
	for(int i=1;i<=n;++i){
		in>>a;
		st->update(i,a);
	}
	for(int i=1;i<=m;++i){
		in>>op>>a>>b;
		if(op==0){
			out<<st->query(a,b)<<"\n";
			continue;
		}
		st->update(a,b);
	}
	return 0;
}