Cod sursa(job #2174350)

Utilizator theodor.vladTheodor Vlad theodor.vlad Data 16 martie 2018 11:43:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#define INF 1000000001
#define max(a, b) a > b ? a : b

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

void create(int, int, int);
int query(int, int, int, int, int);
void update(int, int, int, int);

int st[400005], a[100005];

int main()
{
	int n, m, tip, x, y;

	fin >> n >> m;
	for (int i = 1; i <= n; i++)
		fin >> a[i];
	create(1, 1, n);

	for (int i = 1; i <= m; i++)
	{
		fin >> tip >> x >> y;
		if (tip == 0) fout << query(1, 1, n, x, y) << '\n';
		else
		{
			a[x] = y;
			update(1, 1, n, x);
		}
	}
	return 0;
}

int query(int node, int l, int r, int x, int y)
{
	if (l >= x && r <= y)
		return st[node];

	int leftChild = -INF, rightChild = -INF;
	int m = l + (r - l) / 2;
	if (x <= m) leftChild = query(2 * node, l, m, x, y);
	if (m < y)  rightChild = query(2 * node + 1, m + 1, r, x, y);
	return max(leftChild, rightChild);
}

void update(int node, int l, int r, int pos)
{
	if (l == r)
		st[node] = a[l];
	else
	{
		int m = l + (r - l) / 2;
		if (pos <= m) update(2 * node, l, m, pos);
		else update(2 * node + 1, m + 1, r, pos);
		st[node] = max(st[2 * node], st[2 * node + 1]);
	}
}

void create(int node, int l, int r)
{
	if (l == r)
		st[node] = a[l];
	else
	{
		int m = l + (r - l) / 2;
		create(2 * node, l, m);
		create(2 * node + 1, m + 1, r);
		st[node] = max(st[2 * node], st[2 * node + 1]);
	}
}