Cod sursa(job #798326)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 16 octombrie 2012 12:26:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>
using namespace std;

int arbint[4000000];
int u_pos, u_val;
int q_st, q_dr, maxim; 

void query(int nod, int st, int dr) {
	if(q_st <= st && dr <= q_dr) {
		maxim = max(maxim, arbint[nod]);
		return;
	}
	int mij = (st + dr) / 2;
	if(q_st <= mij) query(2*nod, st, mij);
	if(mij < q_dr) query(2*nod + 1, mij+1, dr);
} 

void update(int nod, int st, int dr) {
	if(st == dr) {
		arbint[nod] = u_val;
		return;
	}
	int mij = (st + dr) / 2;
	if(u_pos <= mij) update(2*nod, st, mij);
	else update(2*nod + 1, mij+1, dr);
	arbint[nod] = max(arbint[nod*2], arbint[nod*2 + 1]);
}

int main(void) {
	int n, m;
	ifstream fin("arbint.in");
	fin >> n >> m;
	for(int i = 1; i <= n; ++i) {
		int nr;
		fin >> nr; u_pos = i; u_val = nr;
		update(1, 1, n);
	} 
	
	ofstream fout("arbint.out");
	for(int i = 0; i < m; ++i) {
		int op, arg1, arg2;
		fin >> op >> arg1 >> arg2;
		if(op == 0) {
			maxim = 0; q_st = arg1; q_dr = arg2;
			// cout << q_st << ' ' << q_dr << '\n';
			query(1, 1, n);
			fout << maxim << '\n';
		}
		else {
			u_pos = arg1; u_val = arg2;
			update(1, 1, n);
		}
	} 
	fin.close();
	fout.close();
}