Cod sursa(job #472651)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 25 iulie 2010 23:59:17
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#define nmax 400005
#define ll long long

using namespace std;

const char iname[] = "arbint.in";
const char oname[] = "arbint.out";

ifstream fin(iname);
ofstream fout(oname);

ll N, M, i, j, k, l, maxim, start, finish, pos, val, op, a, b;
ll Arb[nmax];

void query(ll nod, ll left, ll right)
{	
	if(start <= left && right <= finish)
	{
		if(maxim < Arb[nod])
		{
			maxim = Arb[nod];
			return;
		}
	}
	else
	{
		ll mj = (left + right) / 2;
		if(start <= mj)
			query(2 * nod, left, mj);
		if(mj < finish)
			query(2 * nod + 1, mj + 1, right);
	}
}
	
void update(ll nod, ll left, ll right)
{
	if(left == right)
	{
		Arb[nod] = val;
		return;
	}
	else
	{
		ll mj = (left + right) / 2;
		if(pos <= mj)
			update(2 * nod, left, mj);
		else
			update(2 * nod + 1, mj + 1, right);
		Arb[nod] = max(Arb[2*nod], Arb[2*nod + 1]);
	}
}

int main()
{
	fin >> N >> M;
	for(i = 1; i <= N; i ++)
	{	
		fin >> val;
		pos = i;
		update(1, 1, N);
	}
	for(i = 1; i <= M; i ++)
	{
		fin >> op >> a >> b;
		if(op == 0)
			{	
				maxim = -1;
				start = a;
				finish = b;
				query(1, 1, N);
				fout << maxim << "\n";
			}
		else
		{
			pos = a;
			val = b;
			update(1, 1, N);
		}
	}
	return 0;
}