Cod sursa(job #2373580)

Utilizator Catalin_BorzaBorza Catalin-Mihai Catalin_Borza Data 7 martie 2019 14:21:38
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <vector>
#define N 200005
#define left(node) 2 * node
#define right(node) 2 * node + 1
using namespace std;

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

struct interval
{
	int l, r, mij;
	long long val;
	interval() : l(0), r(0), mij(0), val(0) {};
	interval(int L, int R, long long V) : l(L), r(R), mij((L + R) / 2), val(V) {};
};

int m, n;
interval tree[N];
auto maxx = [](long long a, long long b) {return (a > b ? a : b); };

void build_tree(int node, int st, int dr)
{
	if (st == dr)
	{
		long long x;
		f >> x;
		tree[node] = interval(st, dr, x);
	}
	else
	{
		int mij = (st + dr) / 2;
		build_tree(left(node), st, mij);
		build_tree(right(node), mij + 1, dr);
		tree[node] = interval(st, dr, maxx(tree[left(node)].val, tree[right(node)].val));
	}
}

#pragma region update
int _update_pos;
long long _update_nr;
void _update_tree(int node)
{
	if (tree[node].l == tree[node].r && tree[node].r == _update_pos)
		tree[node].val = _update_nr;
	else
	{
		if (_update_pos <= tree[node].mij)
			_update_tree(left(node));
		else _update_tree(right(node));
		tree[node].val = maxx(tree[left(node)].val, tree[right(node)].val);
	}
}
void update(int pos, long long nr)
{
	_update_pos = pos;
	_update_nr = nr;
	_update_tree(1);
}
#pragma endregion

#pragma region query
long long _query_result;
int _q_left, _q_right;
void _query(int node)
{
	if (_q_left <= tree[node].l && _q_right >= tree[node].r)
	{
		if (tree[node].val > _query_result)
			_query_result = tree[node].val;
		return;
	}
	if (_q_left <= tree[node].mij)
		_query(left(node));
	if (_q_right > tree[node].mij)
		_query(right(node));
}
long long query(int L, int R)
{
	_q_left = L;
	_q_right = R;
	_query_result = -1;
	_query(1);
	return _query_result;
}
#pragma endregion

int main()
{
	char x;
	int y;
	long long z;
	f >> n >> m;
	build_tree(1, 1, n);
	while (m--)
	{
		f >> x >> y >> z;
		if (x == '0')
			g << query(y, z) << "\n";
		else update(y, z);
	}
	return 0;
}