Cod sursa(job #2754283)

Utilizator izotova_dIzotova Daria izotova_d Data 25 mai 2021 16:18:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>

using namespace std;


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

const int N = 100001; //limit for array
int segTree[4 * N];
int ar[N];

void constructTree(int input[], int left, int right, int position)
{
	if (left == right)
	{
		segTree[position] = input[left];
		return;
	}
	int mid = (left + right) / 2;
	constructTree(input, left, mid, 2 * position + 1);
	constructTree(input, mid + 1, right, 2 * position + 2);
	segTree[position] = max(segTree[2 * position + 1], segTree[2 * position + 2]);

}
void update(int left, int right, int index, int value,int position)
{
	if (left == right)
	{
		segTree[position] = value;
	}
	else
	{
		int mid = (left + right) / 2;
		if (index >= left && index <= mid)
		{
			update(left, mid, index, value, 2 * position + 1);
		}
		else
		{
			update(mid + 1, right, index, value, 2 * position + 2);
		}
		
		segTree[position] = max(segTree[2 * position + 1], segTree[2 * position + 2]);
	}
}

int findMax(int left, int right, int l_index, int r_index, int position)
{
	if (l_index <= left && r_index >= right)
	{
		return segTree[position];
	}
	if (l_index > right || r_index < left)
	{
		return -1;
	}
	int answer_left, answer_right;
	int mid = (left + right) / 2;
	answer_left = findMax(left, mid, l_index, r_index, 2 * position + 1);
	answer_right = findMax(mid + 1, right, l_index, r_index, 2 * position + 2);

	return max(answer_left, answer_right);
}

int main()
{
	int n, m, operation;

	fin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		fin >> ar[i];
	}
	
	constructTree(ar, 0, n-1, 0);

	for (int i = 0; i < m; i++)
	{
		fin >> operation;

		if (operation == 0)
		{
			int l_index, r_index;
			fin >> l_index >> r_index;
			fout << findMax(0, n - 1, l_index - 1, r_index - 1, 0) << "\n";
		}
		else
		{
			int index, value;
			fin >> index >> value;
			update(0, n - 1, index - 1, value, 0);
		}
	}

}