Cod sursa(job #625322)

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

int vect_arb[2000967];

int query_st, query_dr, maxim;
int update_pos, update_val;

void update(int, int, int);
void query(int, int, 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, maxim = 0;
			query(1, 1, n);
			fout << maxim << '\n';
		}
		else {
			update_pos = a, update_val = b;
			update(1, 1, n);
		}
	}
	fout.close();
	fin.close();
}


void update(int nod, int a, 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
}

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