Cod sursa(job #756347)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 9 iunie 2012 15:49:54
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define dim 300000

FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");

int A[dim],n,m,i,y;

inline int maxim(int a , int b){

	return (a>b)?a:b;
}

int querry(int nod, int st,int dr,int a , int b){
	//interoghez arborele ce in a[nod] stie informatia pentru intervalul [st,dr] cu intervalul [a,b]
	int max=-1000,mij,ns=nod<<1,max1=-100;
	if(a<=st&&dr<=b)
		return A[nod];
	mij=((st+dr)>>1);
	if(mij>=a)
		max=querry(ns,st,mij,a,b);
	if((mij+1)<=b)
		max1=querry(ns+1,mij+1,dr,a,b);
	return maxim(max,max1);
}
void update(int nod , int st , int dr , int x){
	int ns=nod<<1;
	if(st==dr) {
		A[nod] = y;
		return;
	}
	int mij=((st+dr)>>1);
	if(st<=x&&x<=mij)
		update(ns,st,mij,x);
	if((mij+1)<=x&&x<=dr)
		update(ns+1,mij+1,dr,x);
	A[nod]=maxim(A[ns],A[ns+1]);
}

int main(){
	int a,b,op;
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&y);
		update(1,1,n,i);
	}
	
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&op,&a,&y);
		switch(op){
		case 0:
			fprintf(g,"%d\n",querry(1,1,n,a,y));
			break;
		default:
			update(1,1,n,a);
			break;
		}
	}
	return 0;
}