Cod sursa(job #726996)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 27 martie 2012 17:57:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#define nmax 100005
int x[3*nmax],v[nmax],n,m;
FILE *f;
void cit(){
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		fscanf(f,"%d",&v[i]);
}
void init(int k,int st,int dr){
	int m;
	if(st==dr)
		x[k]=v[st];
	else{
		m=(st+dr)/2;
		init(2*k,st,m);
		init(2*k+1,m+1,dr);
		if(x[2*k]>x[2*k+1])
			x[k]=x[2*k];
		else
			x[k]=x[2*k+1];
	}
}
int query(int k,int st,int dr,int a,int b){
	if(a<=st&&dr<=b)
		return x[k];
	else{
		int m,val,max=0;
		m=(st+dr)/2;
		if(a<=m){
			val=query(2*k,st,m,a,b);
			if(val>max)
				max=val;
		}
		if(b>=m+1){
			val=query(2*k+1,m+1,dr,a,b);
			if(val>max)
				max=val;
		}
		return max;
	}
}
void update(int k,int st,int dr,int a,int b){
	if(st==dr)
		x[k]=b;
	else{
		int m;
		m=(st+dr)/2;
		if(a<=m){
			update(2*k,st,m,a,b);
			if(x[2*k]<x[2*k+1])
				x[k]=x[2*k+1];
			else
				x[k]=x[2*k];
		}else{
			update(2*k+1,m+1,dr,a,b);
			if(x[2*k]<x[2*k+1])
				x[k]=x[2*k+1];
			else
				x[k]=x[2*k];
		}
	}
}
int main(){
	FILE *g;
	int a,b,c;
	f=fopen("arbint.in","r");
	g=fopen("arbint.out","w");
	cit();
	init(1,1,n);
	for(int i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&c,&a,&b);
		if(c==0)
			fprintf(g,"%d\n",query(1,1,n,a,b));
		else
			update(1,1,n,a,b);
	}
	fclose(f);
	fclose(g);
	return 0;
}