Cod sursa(job #1049246)

Utilizator rvnzphrvnzph rvnzph Data 7 decembrie 2013 09:37:49
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <cstring>

using namespace std;

#define LEFT(x) (2*x+1)
#define RIGHT(x) (2*x+2)

#define max(a,b) (a<b?b:a)

int ai[131073];

void update(int node,int L,int R,int pos,int val)
{
	if(L==R&&L==pos)
	{
		ai[node]=val;
		return;
	}

	int M=L+(R-L)/2;

	if(pos<=M) update(LEFT(node),L,M,pos,val);
	else update(RIGHT(node),M+1,R,pos,val);

	ai[node]=max(ai[LEFT(node)],ai[RIGHT(node)]);
}

int query(int node,int L,int R,int a,int b)
{
	if(a<=L&&R<=b) return ai[node];

	int M=L+(R-L)/2;

	int qL,qR;
	qL=qR=0;
	if(a<=M) qL=query(LEFT(node),L,M,a,b);
	if(b>M) qR=query(RIGHT(node),M+1,R,a,b);

	return max(qL,qR);
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);

	memset(ai,0,sizeof(ai));

	int N,M;
	scanf("%d%d",&N,&M);
	
	--N;
	for(int i=0;i<=N;++i)
	{
		int x;
		scanf("%d",&x);
		update(0,0,N,i,x);
	}

	while(M--)
	{
		int op,a,b;
		scanf("%d%d%d",&op,&a,&b);

		if(op==0) printf("%d\n",query(0,0,N,a-1,b-1));
		else update(0,0,N,a-1,b);
	}

	return 0;
}