Cod sursa(job #2550697)

Utilizator CriviCriveanu Bogdan Crivi Data 19 februarie 2020 01:11:42
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in;
ofstream out;

vector <int> tree;

int n,minim,m;

void build(int vert, int lf, int rg)
{
	if (lf == rg)
	{
		in >> tree[vert];
	}
	else
	{
		int mid = (lf + rg) / 2;
		build(vert * 2, lf, mid);
		build(vert * 2 + 1, mid + 1, rg);
		tree[vert] = max(tree[vert * 2], tree[vert * 2 + 1]);
	}
}

void query(int vert, int lf, int rg, int a, int b)
{
	if (a <= lf and rg <= b)
	{
		minim = max(minim, tree[vert]);
	}
	else
	{
		int mid = (lf + rg) / 2;
		if (a <= mid)
			query(2 * vert, lf, mid, a, b);
		if (b > mid)
			query(2 * vert + 1, mid + 1, rg, a, b);
	}
}

void update(int vert, int lf, int rg, int a, int b)
{
	if (lf == rg)
	{
		tree[vert] = b;
	}
	else
	{
		int mid = (lf + rg) / 2;
		if (a <= mid)
			update(2 * vert, lf, mid, a, b);
		if (a > mid)
			update(2 * vert + 1, mid + 1, rg, a, b);
		tree[vert] = max(tree[vert * 2], tree[vert * 2 + 1]);
	}
}

int main()
{
	in.open("arbint.in");
	out.open("arbint.out");

	in >> n >> m;

	tree.resize(4 * n + 100);

	build(1, 1, n);

	int p, a, b;

	for (int i = 0; i < m; i++)
	{
		in >> p >> a >> b;
		//out << p << a << b << endl;
		if (p == 0)
		{
			minim = 0;
			query(1, 1, n, a, b);
			out << minim <<'\n';
		}
		else
			update(1, 1, n, a, b);
	}
	out.close();
	return 0;
}