Cod sursa(job #1749128)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 27 august 2016 21:41:11
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <climits>
#include <math.h>
 
using namespace std;
int m, n, aux, start = 0, p1, p2;
vector<int> original;
vector<vector<int> > operatii;
ifstream infile; 
ofstream outfile; 

void constructTree (vector<int> &original, vector<int> &arbore, int start, int end, int poz) {
	if (start == end) {
		arbore[poz] = original[start];
		return;
	}
	int mid = (start + end) / 2;
	constructTree(original, arbore, start, mid, poz * 2 + 1);
	constructTree(original, arbore, mid + 1, end, poz * 2 + 2);
	arbore[poz] = max(arbore[poz * 2 + 1], arbore[poz * 2 + 2]);
} 

int findMax (vector<int> &arbore, int a, int b, int start, int end, int poz) {
	if (start >= a && b >= end)
		return arbore[poz];
	if (b < start || a > end)
		return INT_MIN;
	int mid = (start + end) / 2;
	return max(findMax(arbore, a, b, start, mid, poz * 2 + 1), findMax(arbore, a, b, mid + 1, end, poz * 2 + 2));
}

int main() {
   	infile.open("arbint.in");
	outfile.open("arbint.out");

	infile >> n >> m;

	for (int i = 0; i < n; i ++) {
		infile >> aux;
		original.push_back(aux);
	}
	
	int p = 0;
	while (pow(2, p) < original.size())
		p ++;
	int arb_size = pow(2, p) * 2 - 1;
	vector<int> arbore(arb_size);

	infile >> aux;
	while (aux == 1) {
		infile >> p1 >> p2;
		original[p1 - 1] = p2;
		start ++;
		infile >> aux;
	}

	constructTree (original, arbore, 0, original.size() - 1, 0);
	
	for (int i = start; i < m; i ++) {
		infile >> p1 >> p2;
		if (aux == 0)
			outfile << findMax(arbore, p1 - 1, p2 - 1, 0, original.size() - 1, 0) << endl;	
		else {
			arbore.clear();
			original[p1 - 1] = p2;
			constructTree (original, arbore, 0, original.size() - 1, 0);
		}
		if (i != m - 1)
			infile >> aux;
	}

	return 0;
}