Cod sursa(job #595268)

Utilizator maritimCristian Lambru maritim Data 11 iunie 2011 19:21:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>

#define MaxN 2000000
#define lf (2 * nod)
#define rf (2 * nod) + 1
#define mij (st + dr) / 2

int AI[MaxN];
int A[100100];
int N;
int M;
int stare;
int a;
int b;

inline int max(int a,int b)
{
	return a>b ? a:b;
}

int build(int nod,int st,int dr)
{
	if(st == dr)
		AI[nod] = A[st];
	else
		AI[nod] = max(build(lf,st,mij),build(rf , mij+1 , dr));
	return AI[nod];
}

int update(int nod,int st,int dr,int t,int v)
{
	if(st == dr)
		AI[nod] = v;
	if(st < dr && st <= t && t <= dr)
	{
		if(t <= mij)
		{
			update(lf , st , mij , t , v);
			AI[nod] = max(AI[rf],AI[lf]);
		}
		else
		{
			update(rf , mij + 1 , dr , t , v);
			AI[nod] = max(AI[rf],AI[lf]);
		}
	}
}

int querry(int nod,int st,int dr,int a,int b)
{
	int sum = 0;
	if(a <= st && dr <= b)
		return AI[nod];
	if(a <= mij)
		sum = max(sum , querry(lf , st , mij , a , b));
	if(mij < b)
		sum = max(sum , querry(rf , mij + 1 , dr , a , b));
	return sum;	
}

int main()
{
	FILE *f = fopen("arbint.in","r");
	FILE *g = fopen("arbint.out","w");
	
	fscanf(f,"%d %d",&N,&M);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&A[i]);
	build(1,1,N);
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d %d",&stare,&a,&b);
		if(!stare)
			fprintf(g,"%d \n",querry(1,1,N,a,b));
		else
			update(1,1,N,a,b);
	}
	
	fclose(g);
	fclose(f);
	return 0;
}