Cod sursa(job #2606029)

Utilizator michael_blazemihai mihai michael_blaze Data 26 aprilie 2020 19:19:09
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 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 a, int b) {
	if (query[(a - 1) / part + 1] > b)
		query[(a - 1) / part + 1] = b;
	arr[a] = b;
}
int getMax(int a, int b) {
	int max = arr[a];
	int i = a;
	while ((i - 1) % part != 0 and i <= b) {
		if (max < arr[i])
			max = arr[i];
		i ++;
	}
	while((i - 1) % part == 0 and i + part <= b) {
		if (max < arr[i])
			max = arr[i];
		i += part;
	}
	while (i <= b) {
		if (max < arr[i])
			max = arr[i];
		i ++;
	}
	return max;
}

int main() {
	fin >> n >> m;

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

	int i;
	for (i = 1;i <= n - part + 1;i += part) {
		int max = arr[i];
		for (int j = i;j <= part + i - 1;j ++)
			if (max < arr[j])
				max = arr[j];
		query[(i - 1) / part + 1] = max;
	}
	int max = arr[i];
	int j = i;
	for (;i <= n;i ++) {
		if (max < arr[i])
			max = arr[i];
	}

	query[(j - 1) / part + 1] = max;

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