Cod sursa(job #1088118)

Utilizator anaid96Nasue Diana anaid96 Data 20 ianuarie 2014 10:38:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
//Include
#include<stdio.h>
#include<algorithm>
using namespace std;

FILE *in,*out;

//definitii
#define stanga 2*nod
#define dreapta 2*nod+1

//constante
const int Nmax=(int)4e5+1;

//functii
void arb(int nod,int left,int right);
void query(int nod,int left,int right);

//variabile
int n,questions,val,poz,tip,lim1,lim2,loc;
int tree[Nmax];

int main(void)
{
	in=fopen("arbint.in","rt");
	out=fopen("arbint.out","wt");
	fscanf(in,"%d%d",&n,&questions);
	for(poz=1;poz<=n;++poz)
	{	
		fscanf(in,"%d",&val);
		arb(1,1,n);
	}	
	for(int i=1;i<=questions;++i)
	{
		fscanf(in,"%d",&tip);
		if(tip)
		{
			fscanf(in,"%d%d",&poz,&val);
			arb(1,1,n);
		}
		else
		{
			fscanf(in,"%d%d",&lim1,&lim2);
			val=0;
			query(1,1,n);
			fprintf(out,"%d\n",val);
		}	
			
	}	

	fclose(in);
	fclose(out);
	return 0;
}	

void arb(int nod,int left,int right)
{
	if(left==right)
	{	
		tree[nod]=val;
		return;
	}	
	int mid=(left+right)/2;
	if(poz<=mid)
		arb(stanga,left,mid);
	else
		arb(dreapta,mid+1,right);
	tree[nod]=max(tree[stanga],tree[dreapta]);
	
}	

void query(int nod,int left,int right)
{
	if(lim1<=left && right<=lim2)
	{
		val=max(val,tree[nod]);
		return;
	}	
	
	int mid=(left+right)/2;
	if(lim1<=mid)
		query(stanga,left,mid);
	if(mid<lim2)	
		query(dreapta,mid+1,right);
	
}