Cod sursa(job #1441967)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 24 mai 2015 13:51:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");

const int MAX_NOD = 4*100005+3;

int i,n,m,oper,a,b,sol,x,arb[MAX_NOD];

void creare_arbore(int nod, int st, int dr){
	 if(st==dr){
	 	fi>>x;
	 	arb[nod]=x;
	 }else{
	 	int mijl=(st+dr)/2;
	 	creare_arbore(2*nod,st,mijl);
	 	creare_arbore(2*nod+1,mijl+1,dr);
	 	arb[nod]=max(arb[2*nod],arb[2*nod+1]);
	 }
}

void update(int nod, int st, int dr, int poz, int valoare){
	 if(st==dr) arb[nod]=valoare;
	 else{
	 	 int mijl=(st+dr)/2;
		 if(poz<=mijl) update(2*nod,st,mijl,poz,valoare);
		 else update(2*nod+1,mijl+1,dr,poz,valoare);
		 arb[nod]=max(arb[2*nod],arb[2*nod+1]);
	 }
}

void query(int nod, int st, int dr, int a, int b){
	 if(a<=st && dr<=b){
	 	sol=max(sol,arb[nod]);
	 }else{
	 	int mijl=(st+dr)/2;
	 	if(a<=mijl) query(2*nod,st,mijl,a,b);
	 	if(mijl+1<=b) query(2*nod+1,mijl+1,dr,a,b);
	 }
}


int main(){
	fi>>n>>m;
	creare_arbore(1,1,n);
	
	for(i=1;i<=m;i++){
		fi>>oper>>a>>b;
		if(oper==0){
			sol=0;
			query(1,1,n,a,b);
			fo<<sol<<"\n";
		} else update(1,1,n,a,b);
	}
	
	fi.close();
	fo.close();
	return 0;
}