Cod sursa(job #1067958)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 27 decembrie 2013 18:27:42
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#define M ((l+r)/2)
const int maxn = 100000;
using namespace std;
 
int a[maxn],h[maxn*2];
 int n,m;
 
 void create(int l=1,int r=n, int nod =1){
 	if(l==r){
 		h[nod]=a[l];return;
 	}
 //	int m = (l+r)/2;
 	create(l,M,2*nod);
 	create(M+1,r,nod*2+1);
 	h[nod]=max(h[nod*2],h[nod*2+1]);
 }
 
 void update(int pos,int v,int l=1,int r=n, int nod=1){
 	if(r==l){
 		h[nod]=v;return;
 	}
 //int	m =(l+r)/2;
 	if(pos <= M) update(pos,v,l,M,nod*2);
 	else update(pos,v,M+1,r,nod*2+1);
 	h[nod]=max(h[nod*2],h[nod*2+1]);
 }
 
int fmax(int a,int b,int l=1,int r=n,int nod=1){
 	if (a>r || b<l )return 0;
 	if(a<=l && b>=r)return h[nod];
 //int	m =(l+r)/2;
 	return max(fmax(a,b,l,M,nod*2),fmax(a,b,M+1,r,nod*2+1));
 }

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

fin>>n>>m;
for(int i=1;i<=n;i++){
fin>>a[i]; 
}
create();


int a,x,y;
for(int i=1;i<=m;i++){
	fin>>a>>x>>y;

	if(a==0){
		 fout<<fmax(x,y)<<"\n";
	}else{
	 update(x,y);
	}
}

  fin.close(); fout.close();  
}