Cod sursa(job #541308)

Utilizator n3msizN3msiz n3msiz Data 24 februarie 2011 23:19:18
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>

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

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

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

int query(int nod,int s,int d){
	int qst=0;
	int qdr=0;
	if(x<=s && d<=y)
		return v[nod];
	int mij=(s+d)/2;
	int nodst=2*nod;
	int noddr=nodst+1;
	if(x<=mij)
		qst=query(nodst,s,mij);
	if(x>mij)
		qdr=query(noddr,mij+1,d);
	return maxim(qst,qdr);
}

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==0)
			fprintf(g,"%d\n",query(1,1,n));
		else{
			a=x;
			k=y;
			update(1,1,n);
		}
	}
	
	fclose(f);
	fclose(g);
	return 0;
}