Cod sursa(job #1139697)

Utilizator irimiecIrimie Catalin irimiec Data 11 martie 2014 13:26:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int DIM = 100010;
int n, m, pos, val, maxim, start, stop, arb[4*DIM+100];

void update(int nod, int l, int r)
{
	if(l == r)
	{
		arb[nod] = val;
		return;
	}
	
	int mid = l + (r-l)/2;
	if(pos <= mid)
		update(2 * nod, l, mid);
	else
		update(2 * nod + 1, mid + 1, r);
		
	arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}

void query(int nod, int l, int r)
{
	int mid;
	
	if(l >= start && r <= stop)
	{
		if(arb[nod] > maxim)
			maxim = arb[nod];
		return;
	}
	
	mid = l + (r - l) / 2;
	if(start <= mid)
		query(2 * nod, l, mid);
	if(mid < stop)
		query(2 * nod + 1, mid + 1, r);
}

void read()
{
	f >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		f >> val;
		pos = i;
		update(1, 1, n);
	}
}

void debug()
{
	for(int i = 1; i < 2 * n; ++i)
		cout << arb[i] << " ";
}

int main()
{
	int type;
	
	read();
	
	for(int i = 1; i <= m; ++i)
	{
		f >> type;
		if(type)
		{
			f >> pos >> val;
			update(1, 1, n);
		}
		else
		{
			f >> start >> stop;
			maxim = -1;
			query(1, 1, n);
			g << maxim << '\n';
		}
	}
	
	//debug();
}