Cod sursa(job #1012082)

Utilizator teoionescuIonescu Teodor teoionescu Data 17 octombrie 2013 23:20:02
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#define max(a,b) (a>b?a:b)
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int Nmax = 100005;
int A[20*Nmax],maxim;
int N,M;
void Update(int st,int dr,int sto,int dro,int upd,int i){
	if(st==dr){
		A[i]=upd;
	}
	else{
		int mij=(st+dr)/2;
		if(sto<=mij) Update(st,mij,sto,dro,upd,2*i);
		if(mij+1<=dro) Update(mij+1,dr,sto,dro,upd,2*i+1);
		A[i]=max(A[2*i],A[2*i+1]);
	}
}
void query(int st,int dr,int sto,int dro,int i){
	if(sto<=st && dr<=dro){
		if(maxim<A[i]) maxim=A[i];
	}
	else{
		int mij=(st+dr)/2;
		if(sto<=mij) query(st,mij,sto,dro,2*i);
		if(mij+1<=dro) query(mij+1,dr,sto,dro,2*i+1);
	}
}
int Query(int a,int b){
	maxim=0;
	query(1,N,a,b,1);
	return maxim;
}
int main(){
	in>>N>>M;
	for(int i=1;i<=N;i++){
		int val;
		in>>val;
		Update(1,N,i,i,val,1);
	}
	for(int i=1;i<=M;i++){
		int op,a,b;
		in>>op>>a>>b;
		if(op==0) out<<Query(a,b)<<'\n';
		if(op==1) Update(1,N,a,a,b,1);
	}
	return 0;
}