Cod sursa(job #626615)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 27 octombrie 2011 19:31:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

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

const int N=100001;

int n,m,poz[N],aux,maximglobal;//pozitia in arborele de intervale ale int cu un singur element, al i-lea citit
long long v[14*N];

inline long long maxim(long long a,long long b){
	return a>b? a: b;
}

inline void BuildTree(int st,int dr,int x){
	if(st==dr){
		++aux;
		in>>v[x];
		poz[aux]=x;
		return;
	}
	int m=(st+dr)/2;
	BuildTree(st,m,2*x);
	BuildTree(m+1,dr,2*x+1);
	v[x]=maxim(v[2*x],v[2*x+1]);
}

inline void Question(int st,int dr,int a,int b,int x){
	if(st>=a && dr<=b){
		if(v[x]>maximglobal)
			maximglobal=v[x];
		return ;
	}
	int m=(st+dr)/2;
	if(a<=m)
		Question(st,m,a,b,2*x);
	if(b>m)
		Question(m+1,dr,a,b,2*x+1);
}

void UpdateTree(int x){
	int aux=v[x],tata;
	while(x>=2){
		tata=x/2;
		v[tata]=maxim(v[2*tata],v[2*tata+1]);
		x/=2;
	}
}

int main(){
	int i,opval,a,b;
	in>>n>>m;
	BuildTree(1,n,1);
	for(i=1;i<=m;i++){
		in>>opval>>a>>b;
		if(opval==0){
			maximglobal=-1;
			Question(1,n,a,b,1);
			out<<maximglobal<<"\n";
		}
		else{
			v[poz[a]]=b;
			UpdateTree(poz[a]);
		}
	}
	return 0;
}