Cod sursa(job #353820)

Utilizator SheepBOYFelix Liviu SheepBOY Data 6 octombrie 2009 13:14:56
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
int arb[280000];
int init[100000];
int n,m,x,y;
int max(int a,int b)
{
	return (a<b)?b:a;
}
void cstr(int st,int dr,int pos)
{
	if(st==dr)
		init[st]=pos;
	int mij=(st+dr)>>1;
	cstr(st,mij,pos<<1);
	cstr(mij+1,dr,(pos<<1)+1);
}
void update(int pos,int val)
{
	int k=init[pos];
	arb[k]=val;
	for(k>>1;k>0;k>>1)
		arb[k]=max(arb[k<<1],arb[(k<<1)+1]);
}
inline int caut(int st,int dr,int pos)
{
	int mij;
	if(x<=st&&dr>=y)
			return arb[pos];
	if(dr<x||st>y)
		return 0;
	mij=(st+dr)>>1;
	return max(caut(st,mij,pos<<1),caut(mij+1,dr,(pos<<1)+1));
}
int main()
{
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
	scanf("%d%d",&n,&m);
	int aux;
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&aux);
		update(i,x);
	}
	for(int i=0;i<m;++i)
	{
		scanf("%d",&aux);
		if(!aux)
		{
			int val;
			scanf("%d%d",&val,&aux);
			update(aux,val);
		}
		else
		{
			scanf("%d%d",&x,&y);
			printf("%d",caut(1,n,1));
		}
	}
	return 0;
}