Cod sursa(job #1088206)

Utilizator anaid96Nasue Diana anaid96 Data 20 ianuarie 2014 11:52:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE *in,*out;

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

//definitii
#define leftSon 2*nod
#define rightSon 2*nod+1

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

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

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(leftSon,left,mid);
	else
		arb(rightSon,mid+1,right);
	tree[nod]=max(tree[leftSon],tree[rightSon]);
}	

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(leftSon,left,mid);
	if(mid<lim2)
		query(rightSon,mid+1,right);
		
	
}