Cod sursa(job #245362)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 17 ianuarie 2009 21:21:29
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>
#define N 100000
struct nod{ int s,d,m; } arb[2*N];
int fr[N],nr,p;
void build(int n)
{
	if(arb[n].s==arb[n].d)
	{
		scanf("%d",&arb[n].m);
		++p;
		fr[p]=n;
		return;
	}
	arb[2*n].s=arb[n].s;
	arb[2*n].d=(arb[n].s+arb[n].d)/2;
	arb[2*n+1].s=arb[2*n].d+1;
	arb[2*n+1].d=arb[n].d;
	build(2*n);
	build(2*n+1);
	arb[n].m=arb[2*n].m>arb[2*n+1].m?arb[2*n].m:arb[2*n+1].m;
}

int query(int s,int d,int n)
{
	if(s==arb[n].s&&d==arb[n].d)
		return arb[n].m;
	int ms=-1,md=-1;
	if(s<=arb[2*n].d)
		ms=query(s,arb[2*n].d<d?arb[2*n].d:d,2*n);
	if(d>=arb[2*n+1].s)
		md=query(arb[2*n+1].s>s?arb[2*n+1].s:s,d,2*n+1);
	return ms>md?ms:md;
}

void update(int poz, int val)
{
	int ok=1, n=fr[poz]/2, max;
	arb[fr[poz]].m=val;
	do
	{
		max=arb[2*n].m>arb[2*n+1].m?arb[2*n].m:arb[2*n+1].m;
		if(max!=arb[n].m) { arb[n].m=max; n/=2; }
		else ok=0;
	}while(n&&ok);
}

int main()
{
	int m,a,b,op;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&nr,&m);
	arb[1].s=1;
	arb[1].d=nr;
	build(1);
	for(int i=0;i<m;++i)
	{
		scanf("%d%d%d",&op,&a,&b);
		if(op==0) printf("%d\n",query(a,b,1));
		else update(a,b);
	}
	return 0;
}