Cod sursa(job #447682)

Utilizator ooctavTuchila Octavian ooctav Data 30 aprilie 2010 10:53:12
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
// arbint2.cpp : Defines the entry point for the console application.
//

#include <cstdio>
#include<iostream>
using namespace std;

const int NMAX = 100010;

int N, M;
int A[NMAX];
int Arb[NMAX * (1 << 2)];

int query(int creanga, int st, int dr, int l1, int l2)
{
	int x, y;
	if(l1 <= st &&  dr <= l2)
		return Arb[creanga];

	int mij = (st + dr) / 2;
	if(l1 <= mij)
		x = query(creanga*2, st, mij, l1, l2);
	if(mij + 1 <= l2)
		y = query(creanga*2 + 1, mij + 1, dr, l1, l2);

	return max(x, y);
}

void update(int creanga ,int st, int dr, int poz, int x)
{
	if(st == dr)
	{
		Arb[creanga] = x;
		return;
	}

	int mij = (st + dr) / 2;
	if(poz <= mij)
		update(2 * creanga, st, mij, poz, x);
	else
		update(2 * creanga + 1, mij + 1, dr, poz, x);

	Arb[creanga] = max(Arb[2*creanga], Arb[2*creanga + 1]);
}

void citire()
{
	int a, b, iden;

	cin >> N >> M;
	for(int i = 1 ; i <= N ; i++)
	{
		cin >> A[i];
		update(1, 1, N, i, A[i]);
	}

	for(int i = 1 ; i <= M ; i++)
	{
		cin >> iden;
		if(iden == 0)
		{
			cin >> a >> b;
			printf("%d\n", query(1, 1, N, a, b));
		}
		else
		{
			cin >> a >> b;
			update(1, 1, N, a, b);
		}

	}


}

int main()
{
	freopen("arbint2.in","r",stdin);
	freopen("arbint2.out","w",stdout);
	citire();


	return 0;
}