Cod sursa(job #2818527)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 16 decembrie 2021 12:46:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <climits>
using namespace std;

int n, m;
int arbore[400001], v[100001];

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

void build(int nod, int st, int dr)
{
	if (st == dr)
	{
		arbore[nod] = v[st];
	}
	else {
		int mij = (st + dr) / 2;
		build(nod * 2, st, mij);
		build(nod * 2 + 1, mij + 1, dr);

		arbore[nod] = max(arbore[nod * 2], arbore[nod * 2 + 1]);
	}
}

void update(int nod, int st, int dr, int poz, int val)
{
	if (st == dr)
	{
		arbore[nod] = val;
	}
	else {
		int mij = (st + dr) / 2;
		if (poz <= mij)
		{
			update(2 * nod, st, mij, poz, val);
		}
		else 
		{
			update(2 * nod + 1, mij + 1, dr, poz, val);
		}


		arbore[nod] = max(arbore[nod * 2], arbore[nod * 2 + 1]);
	}
}

int query(int nod, int st, int dr, int qSt, int qDr)
{
	if (qSt <= st && dr <= qDr)
	{
		return arbore[nod];
	}
	else {
		int mij = (st + dr) / 2;

		if (qDr <= mij)
		{
			return query(nod * 2, st, mij, qSt, qDr);
		}
		if (mij + 1 <= qSt)
		{
			return query(nod * 2 + 1, mij + 1, dr, qSt, qDr);
		}
		return max(query(nod * 2, st, mij, qSt, qDr),
			query(nod * 2 + 1, mij + 1, dr, qSt, qDr));
	}
}

int main()
{
	fin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		fin >> v[i];
	}
	build(1, 1, n);

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