Cod sursa(job #625314)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 24 octombrie 2011 11:34:17
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
using namespace std;

int vect_arb[1660967];

int query_st, query_dr;
int update_pos, update_val;

void update(const int&, const int&, const int&);
int query(const int&, const int&, const int&);


int main(void) {
	int n, m;
	ifstream fin("arbint.in");
	fin >> n >> m;
	
	int val;
	for(int i = 1; i <= n; ++i) {
			fin >> val;
			update_pos = i; update_val = val;
			update(1, 1, n);
	}
	
	int op, a, b;
	ofstream fout("arbint.out");
	for(int i = 1; i <= m; ++i) {
		fin >> op >> a >> b;
		if(op == 0) {
			query_st = a, query_dr = b;
			fout << query(1, 1, n) << '\n';
		}
		else {
			update_pos = a, update_val = b;
			update(1, 1, n);
		}
	}
	fout.close();
	fin.close();
}


void update(const int& nod, const int& a, const int& b) {
	if(a == b) {
		vect_arb[nod] = update_val;	
		return;
	}
	
	int mij = (a + b) / 2;
	if(update_pos <= mij) update(nod*2, a, mij);
	else update(nod*2 + 1, mij+1, b);
	vect_arb[nod] = max(vect_arb[nod*2], vect_arb[nod*2 + 1]);  // actualizarea parintilor ultima
}

int query(const int& nod, const int& a, const int& b) {
	if(query_st <= a && b <= query_dr)  // inclus in intervalul de interogare
		return vect_arb[nod];  
	
	int mij = (a + b) / 2, maxim = 0;
	if(query_st <= mij) maxim = max(maxim, query(nod*2,  a, mij));
	if(query_dr > mij) maxim = max(maxim, query(nod*2 + 1, mij+1, b));
	return maxim;
}