Cod sursa(job #704522)

Utilizator DevilShadowJunc Raul Cosmin DevilShadow Data 2 martie 2012 18:32:17
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <stdio.h>
#define nm 100000
#define MAX(a, b) ((a > b) ? a : b)

using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");

int n, m, v[nm], maxim;
int val, pos, start, finish;


void query(int nod, int left, int right)
{
	if(start <= left && right <= finish)
	{
		maxim = MAX(maxim, v[nod]);
		return;
	}
	int div = (left + right) / 2;
	if(start <= div) query(nod * 2, left, div);
	if(div < finish) query(nod * 2 + 1, div + 1, right);
}

void update(int nod, int left, int right)
{
	if(left == right)
	{
		v[nod] = val;
		return ;
	}
	
	int d = (left + right) / 2;
	if(pos <= d) update(nod * 2,     left,  d);
		else     update(nod * 2 + 1, d + 1, right);
	v[nod] = MAX(v[nod * 2], v[nod * 2 + 1]);
}

int main()
{
	int x, a, b;
	f >> n >> m;
	for(int i = 1; i <= n; i ++)
	{
		f >> val;
		pos = i;
		update(1, 1, n);
	}
	for(int i = 0; i < m; i ++)
	{
		f >> x >> a >> b;
		if(!x)
		{
			maxim = -1;
			start = a;
			finish = b;
			query(1, 1, n);
			g << maxim << "\n";
		}
		else
		{
			pos = a;
			val = b;
			update(1, 1, n);
		}
	}
}