Cod sursa(job #1049265)

Utilizator rvnzphrvnzph rvnzph Data 7 decembrie 2013 09:59:15
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <cstring>
#include <sstream>

using namespace std;

#define LEFT(x) (x<<1)
#define RIGHT(x) ((x<<1)+1)

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

int ai[262144];

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",&N,&M);
	
	for(int i=1;i<=N;++i)
	{
		int x;
		char ch;
		scanf("%d%c",&x,&ch);
		update(1,1,N,i,x);
	}

	while(M--)
	{
		int op,a,b;
		char s[64];

		gets(s);
		stringstream ss;

		ss<<s;
		ss>>op>>a>>b;

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

	return 0;
}