Cod sursa(job #583565)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 20 aprilie 2011 22:03:15
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>
const int INF=-2000000000;
const int N=100128;
int n,m;
int rez,a[3*N];
int min(int x,int y)
{
	if(x>y)
		return x;
	return y;
}
void update(int poz,int st,int dr,int x,int val)
{
	if(st==dr)
	{
		a[poz]=val;
		return;
	}
	int m=((st+dr)>>1),s=poz<<1,d=s+1;
	if(x<=m)
		update(s,st,m,x,val);
	else
		update(d,m+1,dr,x,val);
	a[poz]=min(a[s],a[d]);
}
void query(int poz,int st,int dr,int x,int y)
{
	if(x<=st && dr<=y)
	{
		rez= min(rez,a[poz]);
		return;
	}
	int m=(st+dr)>>1,s=poz<<1,d=s+1;
	if(x<=m)
		query(s,st,m,x,y);
	if(m<y)
		query(d,m+1,dr,x,y);
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	int i,a,b,c,l;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&l);
		update(1,1,n,i,l);
	}
	for(i=0;i<m;++i)
	{
		scanf("%d%d%d",&c,&a,&b);
		if(c==1)
			update(1,1,n,a,b);
		else
		{
			rez=INF;
			query(1,1,n,a,b);
			printf("%d\n",rez);
		}
	}
	return 0;
}