Cod sursa(job #542920)

Utilizator n3msizN3msiz n3msiz Data 27 februarie 2011 11:01:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>

int n,i,v[4*100010],x,y,k,a,tip,max,m;

int maxim(int x, int y){
	return x>y?x:y;
}

void update(int nod,int s,int d){
	if(s==d){
		v[nod]=k;
		return;
	}
	
	int m=(s+d)/2;
	int nodst=nod*2;
	int noddr=nodst+1;
	if(a<=m)
		update(nodst,s,m);
	else
		update(noddr,m+1,d);
	v[nod]=maxim(v[nodst],v[noddr]);
	}

void query(int nod,int s,int d){
	if(x<=s && d<=y){
		if(v[nod]>max) 
			max=v[nod];
		return;
	}
	
	int m=(s+d)/2;
	int nodst=nod*2;
	int noddr=nodst+1;
	if(x<=m)
		query(nodst,s,m);
	if(m<y)
		query(noddr,m+1,d);
	}



int main(){
	FILE*f=fopen("arbint.in","r");
	FILE*g=fopen("arbint.out","w");
	
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&k);
		a=i;
		update(1,1,n);
	}
	
	for(i=1;i<=m;i++){
		fscanf(f,"%d %d %d",&tip,&x,&y);
		if(!tip){
			max=-1;
			query(1,1,n);
			fprintf(g,"%d\n",max);
		}
		else{
			a=x; k=y;
			update(1,1,n);
		}
	}
	
	fclose(f);
	fclose(g);
	return 0;
}