Cod sursa(job #663890)

Utilizator cristicecCristian Uricec cristicec Data 19 ianuarie 2012 09:19:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#define Nmax 100002
using namespace std;

int n,m,arb[Nmax*4],element_max;

int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

void update(int i,int left,int right,int position,int value)   // position arata pozitia elementului value,care are indicele i ,din 
{                                                                                     // vectorul de intrare
	if(left==right)
	{
		arb[i]=value;
		return ;
	}
	int mid=(left+right)/2;
	if(position<=mid)
		update(2*i,left,mid,position,value);
	else
		update(2*i+1,mid+1,right,position,value);
	arb[i]=max(arb[2*i],arb[2*i+1]);
}

void query(int i,int left,int right,int a,int b)
{
	if(a<=left&&b>=right)
	{
		if(arb[i]>element_max)
			element_max=arb[i];
		return ;
	}
	int mid=(left+right)/2;
	if(a<=mid)
		query(2*i,left,mid,a,b);
	if(b>mid)
		query(2*i+1,mid+1,right,a,b);
}

int main()
{
	register int j,op,x,y;
	FILE *c,*d;
	c=fopen("arbint.in","r");
	d=fopen("arbint.out","w");
	fscanf(c,"%d %d",&n,&m);
	for(j=1;j<=n;j++)
	{
		fscanf(c,"%d",&x);
		update(1,1,n,j,x);
	}
	for(j=1;j<=m;j++)
	{
		fscanf(c,"%d %d %d",&op,&x,&y);
		if(op==0)
		{
			element_max=-1;
			query(1,1,n,x,y);
			fprintf(d,"%d\n",element_max);
		}
		else
			if(op==1)
				update(1,1,n,x,y);
	}
	fclose(c);
	fclose(d);
	return 0;
}