Cod sursa(job #216216)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 23 octombrie 2008 13:51:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
long n, m, i, j, aa, bb, x, t[400000], init[100000];
int tip;

void initializeaza(long st, long dr, long poz);
long interogare(long p, long a, long b);
void modif(long p, long val);
long max(long a, long b);

int main()
{
	freopen("arblong.in", "r", stdin);
	freopen("arblong.out", "r", stdin);
	scanf("%ld%ld", &n, &m);
	initializeaza(1, n, 1);
	for (i=0; i<n; i++)
	{
		scanf("%ld", &x);
		modif(init[i], x);
	}//for i
	for (i=0; i<m; i++)
	{
		scanf("%d%ld%ld", &tip, &aa, &bb);
		if (tip==0)
			printf("%ld", interogare(1, aa, bb));
		if (tip==1)
			modif(init[aa], bb);
	}//for i
	return 0;
}//main

void initializeaza(long st, long dr, long poz)
{
	long mij;
	if (st==dr)
		init[st]=poz;
	else
	{
		mij=(st+dr)/2;
		initializeaza(st, mij, 2*poz);
		initializeaza(mij+1, dr, 2*poz+1);
	}//else
}//initializeaza

long interogare(long p, long a, long b)
{
	long mij, rez;
	if ((aa<=a)&&(b<=bb))
		return t[p];
	mij=(a+b)/2;
	rez=-1;
	if (aa<=mij)
		rez=max(rez, interogare(2*p, a, mij));
	if (bb>mij)
		rez=max(rez, interogare(2*p+1, mij+1, b));
	return rez;
}//interogare

void modif(long p, long val)
{
	t[p]=val;
	p/=2;
	for(;p;p/=2)
		t[p]=max(t[p*2], t[2*p+1]);
}//modif

long max(long a, long b)
{
	if (a>b)
		return a;
	else
		return b;
}//max