Cod sursa(job #2206407)

Utilizator Steff94Stefan Steff94 Data 22 mai 2018 17:08:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<iostream>
#include <limits>
#include<fstream>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int min(int a, int b) {
	if (a <= b)
		return a;
	else
		return b;
}

int max(int a, int b) {
	if (a <= b)
		return b;
	else
		return a;
}

void construct_seg_tree(int *twoarr, int N) {
	/*for (int i = 1; i < 2 * N; i++)
		g << twoarr[i] << " ";
	g << endl;*/

	
	for (int i = N - 1; i >= 1; i--)
		twoarr[i] = min(twoarr[2 * i], twoarr[2 * i + 1]);

	/*for (int i = 1; i < 2 * N; i++)
		g << twoarr[i] << " ";*/
}

void update(int index, int value, int N, int *twoarr) {
	index = index + N;
	twoarr[index] = N;

	while (index > 1) {
		index = index / 2;
		twoarr[index] = min(twoarr[2 * index], twoarr[2 * index + 1]);
	}
}

int maximum(int left, int right, int N, int *twoarr) {
	left = left + N;
	right = right + N;
	int maxim = std::numeric_limits<int>::min();
	//g << endl << "minus_infinity: " << maxim << endl;

	while (left < right) {
		if (left % 2 != 0) {
			maxim = max(maxim, twoarr[left]);
			left = left + 1;
		}
		if (right % 2 != 0) {
			maxim = max(maxim, twoarr[right]);
			right = right - 1;
		}
		left = left / 2; right = right / 2;
	}
	return maxim;
}



int main() {
	int N, M;
	f >> N >> M;
	int i, j, k;

	//reading and constructing the segment tree
	int *twoarr = new int[N * 2];
	for (int i = 0; i < N; i++)
		f >> twoarr[i+N];
	construct_seg_tree(twoarr, N);

	//reading the input from file and updaring/quering the segment tree
	for (int i = 0; i < M; i++) {
		f >> i >> j >> k;
		if (i == 0) {
			g << maximum(j, k, N, twoarr) << endl;
		}
		else {
			update(j, k, N, twoarr);
		}
	}

	return 0;
}