Cod sursa(job #177665)

Utilizator GagosGagos Radu Vasile Gagos Data 13 aprilie 2008 14:38:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>
long a[265150],st[265150],dr[265150],n,m,x,y,z,zero=1,fs,fd,tata,mo,mn;
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==0)
			printf("%ld\n",query(1));
		else{
			a[zero+y]=z;
			tata=(zero+y)>>1;
			while(tata){
				fs=(tata<<1);
				fd=fs|1;
				mo=a[tata];
				mn=(a[fs]>a[fd])?a[fs]:a[fd];
				if(mo==mn)
					break;
				a[tata]=mn;
				tata>>=1;
			}
		}
	}
	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;
}