Cod sursa(job #2189650)

Utilizator Alex_AmarandeiAmarandei Matei Alexandru Alex_Amarandei Data 28 martie 2018 19:35:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#define max(a, b) a > b ? a : b
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

void read();
void update(int node, int position, long long int value, int left, int right);
long long int query(int node, int low, int high, int left, int right);

long long int tree[400005];
int n, m;

int main()
{
	read();

	return 0;
}

void read()
{
	int i, t, a, b;
	long long int x;

	fin >> n >> m;

	for (i = 1; i <= n; i++)
	{
		fin >> x;
		update(1, i, x, 1, n);
	}

	for (i = 1; i <= m; i++)
	{
		fin >> t >> a >> b;
		if (t == 0)
			fout << query(1, a, b, 1, n) << '\n';
		else
			update(1, a, b, 1, n);
	}
}

void update(int node, int position, long long int value, int left, int right)
{
	if (left == right)
		tree[node] = value;
	else
	{
		int mid = left + (right - left) / 2;

		if (position <= mid)
			update(2 * node, position, value, left, mid);
		else
			update(2 * node + 1, position, value, mid + 1, right);
	
		tree[node] = max(tree[2 * node], tree[2 * node + 1]);
	}
}

long long int query(int node, int low, int high, int left, int right)
{
	if (low <= left && right <= high)
		return tree[node];
	else
	{
		int mid = left + (right - left) / 2, jos = -1, sus = -1;
		if (low <= mid)
			jos = query(2 * node, low, high, left, mid);
		if (mid < high)
			sus = query(2 * node + 1, low, high, mid + 1, right);
		return max(jos, sus);
	}
}