Cod sursa(job #1722795)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 28 iunie 2016 21:16:03
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout ("arbint.out");

int n, m;
vector<int> maxTree(2*10001+1);
int maxim = -1;

void update(int posVector, int pos, int left, int right, int val)
{
	if (left == right)
	{
		maxTree[posVector] = val;
		return;
	}
	int div = left + (right - left)/2;
	if (pos <= div)
	{
		update (2*posVector, pos, left, div, val);
	}
	else
		update(2*posVector+1, pos, div+1, right, val);
	maxTree[posVector] = max (maxTree[2*posVector], maxTree[2*posVector+1]);
}

void query (int posVector, int left, int right, int a, int b)
{
	if ( left >= a && right <= b)
	{
		if (maxim < maxTree[posVector])
		{
			maxim = maxTree[posVector];
		} 
	}
	else
	{
		int div = left + (right - left)/2;
		if (a <= div) query (2*posVector, left, div, a, b);
		if (b > div) query (2*posVector + 1, div+1, right, a, b);
	}
}
int main()
{
	int x;
	int pos, value;
	int y, z;
	int val;
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		fin>>val;
		pos = i; 
		update (1, pos, 1, n, val);
	}
	
	for (int i = 1; i <= m; i++)
	{
		fin>>x>>y>>z;
		if (x == 0)
		{
			maxim = -1;
			query (1, 1, n, y, z);
			fout<<maxim<<endl;
		}
		else if (x == 1)
		{
			update (1, y, 1, n, z);
		}
	}
}