Cod sursa(job #1310983)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 7 ianuarie 2015 16:33:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <vector>
#include <algorithm>

std::vector<unsigned> tree;


void update(unsigned pos, unsigned val, unsigned nod, unsigned st, unsigned dr){
	if(st==dr) tree[nod]=val;
	else{
		unsigned mij=(st+dr)/2;
		if(pos<=mij) update(pos,val,nod<<1,st,mij);
		else update(pos,val,(nod<<1)+1,mij+1,dr);

		tree[nod]=std::max(tree[nod<<1],tree[(nod<<1)+1]);
	}
}

unsigned query(unsigned a, unsigned b, unsigned nod, unsigned st, unsigned dr){
	if(a<=st&&dr<=b) return tree[nod];
	else{
		unsigned maxim=0;
		unsigned mij=(st+dr)/2;
		if(a<=mij) maxim=std::max(maxim,query(a,b,nod<<1,st,mij));
		if(b>mij) maxim=std::max(maxim,query(a,b,(nod<<1)+1,mij+1,dr));
		return maxim;
	}
}




int main(){
	std::ifstream fin("arbint.in");
	std::ofstream fout("arbint.out");

	unsigned n,m; fin>>n>>m;

	tree.resize((n<<2)+1,0);

	for(unsigned i=1;i<=n;++i){
		unsigned x; fin>>x;
		update(i,x,1,1,n);
	}

	for(unsigned i=0;i<m;++i){
		char x; unsigned a,b; fin>>x>>a>>b;
		if(x=='0') fout<<query(a,b,1,1,n)<<'\n';
		else update(a,b,1,1,n);

	}
}