Cod sursa(job #2606096)

Utilizator michael_blazemihai mihai michael_blaze Data 26 aprilie 2020 22:40:00
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cmath>

#define MAX 100005
using namespace std;

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

int arr[MAX], query[MAX];
int n, m;
int part;

void update(int index, int value) {
	int indexQ = index / part;
	if (index % part != 0)
		indexQ ++;
	arr[index] = value;
	if(query[indexQ] < value)
		query[indexQ] = value;
	else {
		int max = -1000000005;
		for (int i = part * (indexQ - 1) + 1;i < part * (indexQ - 1) + 1 + part;i ++)
			if (max < arr[i])
				max = arr[i];
		query[indexQ] = max;
	}
}
int getMax(int left, int right) {
	int i = left;
	int max = arr[left];

	while ((i - 1) % part != 0 and i < right) {
		if (max < arr[i])
			max = arr[i];
		i ++;
	}

	while (i + part <= right) {
		int temp = i / part;
		if (i % part != 0)
			temp ++;
		if (max < query[temp])
			max = query[temp];
		i += part;
	}

	while (i <= right) {
		if (max < arr[i])
			max = arr[i];
		i ++;
	}

	return max;
}
int main() {
	fin >> n >> m;

	part = sqrt(n);
	
	for (int i = 1;i <= n;i ++)
		fin >> arr[i];

	int block = 1;
	int max = -1000000005;

	for (int i = 1;i <= n;i ++) {
		if (max < arr[i])
			max = arr[i];
		query[block] = max;
		if (i % part == 0) {
			block ++;
			max = -1000000005;
		}
	}

	int operation, a, b;

	for (int i = 1;i <= m;i ++) {
		fin >> operation >> a >> b;
		if (operation) {
			update(a, b);
		} else {
			fout << getMax(a, b) << '\n';
		}
	}


	return 0;
}