Cod sursa(job #177679)

Utilizator GagosGagos Radu Vasile Gagos Data 13 aprilie 2008 14:47:17
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
long a[265150],st[265150],dr[265150],n,m,x,y,z,zero,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);
	zero=1;
	while(zero<n)
		zero<<=1;
	zero--;
	for(i=1;i<=n;i++){
		st[zero+i]=i;
		dr[zero+i]=i;
		scanf("%ld",&a[zero+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(i=1;i<=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;
			}
		}
	}
	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;
}