Cod sursa(job #2972370)

Utilizator alin_simpluAlin Pop alin_simplu Data 29 ianuarie 2023 13:21:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
using namespace std;

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

vector<int> Tree;
int N, M;
int T, a, b; // query type

void Build(int, int, int);
void Update(int, int, int, int, int);
int Query(int, int, int, int, int);

int main(){
	
	fin >> N >> M;
	Tree.resize(4 * N);
	Build(1, 1, N);
	
	for (int i = 1; i <= M; ++i)
	{
		fin >> T >> a >> b;
		if (T == 1)
			Update(1, 1, N, a, b);
		else
			fout << Query(1, 1, N, a, b) << '\n';
	}
	
	return 0;
}

int Query(int node, int left, int right, int start, int end)
{
	if (left >= start && right <= end)
		return Tree[node];
		
	int mid = (left + right) / 2;
	
	int Max = 0;  // max value
	if (start <= mid)
		Max = Query(2 * node, left, mid, start, end);
	if (mid < end)
		Max = max(Max, Query(2 * node + 1, mid + 1, right, start, end));
	
	return Max;
}

void Update(int node, int left, int right, int start, int end)
{
	if (left == right)
	{
		Tree[node] = end;
		return;
	}
	
	int mid = (left + right) / 2;
	
	if (start <= mid)
		Update(2 * node, left, mid, start, end);
	else
		Update(2 * node + 1, mid + 1, right, start, end);
		
	Tree[node] = max(Tree[2 * node], Tree[2 * node + 1]);
}

void Build(int node, int left, int right)
{
	if (left == right)
	{
		fin >> Tree[node];
		return;
	}
	
	int mid = (left + right) / 2;
	
	Build(2 * node, left, mid);
	Build(2 * node + 1, mid + 1, right);
	
	Tree[node] = max(Tree[2 * node], Tree[2 * node + 1]);
}