Pagini recente » Cod sursa (job #976840) | Cod sursa (job #1994401) | Cod sursa (job #2488604) | Cod sursa (job #1034929) | Cod sursa (job #2058438)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int const nmax = 100000;
int arb[4 * nmax + 1];
void update(int node) { //indice in cadrul arborelui de intervale
if(0 < node) {
arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
update(node / 2);
}
}
int query(int from, int to) { //programezi stabil, inclusiv pentru cazul from > to
int answer = 0; //0 e element neutru la operatia de maxim
if(from == to)
answer = arb[from];
else if(from < to) {
if(from % 2 == 1) {
answer = max(answer, arb[from]);
from++;
}
if(to % 2 == 0) {
answer = max(answer, arb[to]);
to--;
}
answer = max(answer, query(from / 2, to / 2));
}
return answer;
}
int main() {
int n, m;
in >> n >> m;
int k = 0;
while((1 << k) < n){
k++;
}
int ni = (1 << k) - 1;//numarul de noduri interne din arborele de intervale
//se citesc n numere de la tastatura, pune-le in frunzele arborelui de intervale
for(int i = 1 ; i <= n ;i++){
in >> arb[ni + i]; //pe aceasta frunza ai updatat-o deja aici
update((ni + i) / 2); //update direct de parinte. Care e parintele? Vezi desenul I
}
for(int i=1; i<= m; i++) {
int op, x, y;
in >> op >> x >> y;
if(op == 0){
out << query(ni + x , ni + y)<<'\n';
} else{
arb[ni + x] = y;
update((ni + x) / 2);
}
}
return 0;
}