Cod sursa(job #1749167)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 27 august 2016 22:37:38
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <climits>
#include <math.h>
#define dim 100001
 
using namespace std;
int m, n, aux, start = 0, p1, p2, arb_size, a, b;
vector<int> original;
ifstream infile("arbint.in"); 
ofstream outfile("arbint.out"); 

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

int findMax (vector<int> &arbore, 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, start, mid, poz * 2 + 1), findMax(arbore, mid + 1, end, poz * 2 + 2));
}

int nextPow2 ()
{
	if (n < 0)
	        return 0;
	-- n;
	n |= n >> 1;
	n |= n >> 2;
	n |= n >> 4;
	n |= n >> 8;
	n |= n >> 16;
	return n + 1;
}

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

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

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

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

	return 0;
}