Cod sursa(job #353822)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 6 octombrie 2009 13:22:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>
#define N 1<<19
#define NMAX 1<<17
int n,m,arb[N],init[NMAX],tip,x,y;
inline int max(int a,int b)
{
	if (a>b)
		return a;
	return b;
}
void cstr(int st, int dr, int poz){
	if (st==dr){
		init[st]=poz;
		return;
	}
	int mij=(st+dr)/2;
	cstr(st,mij,2*poz);
	cstr(mij+1,dr,2*poz+1);
}
void update(int pozitie,int val){
	int k=init[pozitie];
	arb[k]=val;
	for (k/=2; k>0; k/=2)
		arb[k]=max(arb[2*k],arb[2*k+1]);
}
int caut(int st,int dr,int poz){
	if (x<=st && dr<=y)
		return arb[poz];
	if (st>y || dr<x)
		return 0;
	int mij=(st+dr)/2;
	return max(caut(st,mij,2*poz),caut(mij+1,dr,2*poz+1));
}
void read()
{
	scanf("%d%d",&n,&m);
	int i;
	cstr(1,n,1);
	for (i=1; i<=n; i++)
	{
		scanf("%d",&x);
		update(i,x);
	}
}
void solve()
{
	int i;
	for (i=1; i<=m; i++){
		scanf("%d%d%d",&tip,&x,&y);
		if (tip)
			update(x,y);
		else
			printf("%d\n",caut(1,n,1));
	}
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	read();
	solve();
	return 0;
}