Cod sursa(job #1049303)

Utilizator rvnzphrvnzph rvnzph Data 7 decembrie 2013 10:17:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <cstring>

using namespace std;

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

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

char buffer[131072];
bool ok=true;
int buffIndex=0;
const int bufferLen=131072;

void read(int &value)
{
	value=0;

	if(ok)
	{
		ok=false;
		buffIndex=0;
		fread(buffer,1,bufferLen,stdin);
	}

	while('0'<=buffer[buffIndex]&&buffer[buffIndex]<='9')
	{
		value=value*10+buffer[buffIndex]-'0';
		if(++buffIndex==bufferLen)
		{
			buffIndex=0;
			fread(buffer,1,bufferLen,stdin);
		}
	}

	while('0'>buffer[buffIndex]||buffer[buffIndex]>'9')
		if(++buffIndex==bufferLen)
		{
			buffIndex=0;
			fread(buffer,1,bufferLen,stdin);
		}
}

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;
	read(N);
	read(M);
	
	for(int i=1;i<=N;++i)
	{
		int x;
		read(x);
		update(1,1,N,i,x);
	}

	while(M--)
	{
		int op,a,b;
		read(op);
		read(a);
		read(b);

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

	return 0;
}