Cod sursa(job #551016)

Utilizator acelasi7Tudor Maxim acelasi7 Data 10 martie 2011 11:25:46
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<algorithm>
#define nrn 200000
#define lson(x) (x*2)
#define rson(x) (x*2+1)
using namespace std;
FILE *in=fopen("arbint.in","r"),*out=fopen("arbint.out","w");
int TREE[nrn],n;
void update(int left,int right,int a,int b,int nod,int val)
{
	int mijl;
	if(a<=left&&b>=right)
	{
		TREE[nod]=val;
		return ;
	}
	mijl=(left+right)/2;
	if(a<=mijl)
		update(left,mijl,a,b,nod*2,val);
	if(b>mijl)
		update(mijl+1,right,a,b,nod*2+1,val);
	TREE[nod]=max(TREE[lson(nod)],TREE[rson(nod)]);
}
int query(int left,int right,int a,int b,int nod)
{
	int mijl;
	if(a<=left && b>=right)
		return TREE[nod];
	mijl=(left+right)/2;
	if(a<=mijl && b>mijl)
		return max(query(left,mijl,a,b,nod*2),query(mijl+1,right,a,b,nod*2+1));
	if(a<=mijl)
		return query(left,mijl,a,b,nod*2);
	if(b>mijl)
		return query(mijl+1,right,a,b,nod*2+1);
}

int main()
{
	int i,a,b,m,v;
	fscanf(in,"%d %d",&n,&m);
	for(i=1;i<=n;++i)
	{
		fscanf(in,"%d",&v);
		update(1,n,i,i,1,v);
	}
	for(i=1;i<=m;++i)
	{
		fscanf(in,"%d %d %d",&v,&a,&b);
		switch(v)
		{
		case(0):fprintf(out,"%d\n",query(1,n,a,b,1));break;
		case(1):update(1,n,a,a,1,b);break;
		}
	}
	return 0;
}