Cod sursa(job #1067960)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 27 decembrie 2013 18:31:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 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"); 
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

//fin>>n>>m;
 scanf("%d %d",&n,&m);
 
for(int i=1;i<=n;i++){
//fin>>a[i]; 
scanf("%d",&a[i]);
}
create();


int a,x,y;
for(int i=1;i<=m;i++){
//	fin>>a>>x>>y;
scanf("%d %d %d",&a,&x,&y);
	if(a==0){
		// fout<<fmax(x,y)<<"\n";
		printf("%d\n",fmax(x,y));
	}else{
	 update(x,y);
	}
}

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