Cod sursa(job #177663)

Utilizator GagosGagos Radu Vasile Gagos Data 13 aprilie 2008 14:32:33
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
long a[265150],st[265150],dr[265150],n,m,x,y,z,zero=1,fs,fd,tata;
long query(long p);
int main()
{
	long i;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	while(zero<n)
		zero<<=1;
	zero--;
	for(i=zero+1;i<=zero+n;++i){
		st[i]=i-zero;
		dr[i]=i-zero;
		scanf("%ld",&a[i]);
	}
	for(i=n+1;i<=zero+1;++i){
		st[zero+i]=st[i];
		dr[zero+i]=dr[i];
	}
	for(i=zero;i>=1;--i){
		fs=(i<<1);
		fd=fs|1;
		st[i]=st[fs];
		dr[i]=dr[fd];
		a[i]=(a[fs]>a[fd])?a[fs]:a[fd];
	}
	for(;m;--m){
		scanf("%ld%ld%ld",&x,&y,&z);
		if(!x)
			printf("%ld\n",query(1));
		else{
			a[zero+y]=z;
			tata=(zero+y)>>1;
			do{
				a[tata]=(a[tata<<1]>a[(tata<<1)|1])?a[tata<<1]:a[(tata<<1)|1];
				tata>>=1;
			}while(tata);
		}
	}
	fcloseall();
	return 0;
}
long query(long p)
{
	long m1,m2;
	if(y>dr[p])
		return 0;
	if(z<st[p])
		return 0;
	if(y<=st[p] && z>=dr[p])
		return a[p];
	m1=query(p<<1);
	m2=query((p<<1)|1);
	m1=(m1>m2)?m1:m2;
	return m1;
}