Pagini recente » Clasament cosminmorarfmi3 | Cod sursa (job #1203856) | oni_mixt2 | Arhiva de probleme | Cod sursa (job #2756051)
#include <iostream>
#include <algorithm>
#include <fstream>
#define mid (st+dr)/2
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m, q, a, b, arbore[100001], x, start, fin, poz, maxim, val;
void actualizare(int nod, int st, int dr) {
if (st == dr) {
arbore[nod] = val;
return;
}
if (poz <= mid)
actualizare(2 * nod, st, mid);
else
actualizare(2 * nod + 1, mid + 1, dr);
arbore[nod] = max(arbore[2 * nod + 1], arbore[2 * nod]);
}
void interogare(int nod, int st, int dr) {
if (start <= st && dr <= fin) {
if (maxim < arbore[nod])
maxim = arbore[nod];
return;
}
if (start <= mid)
interogare(2 * nod, st, mid);
if (mid < fin)
interogare(2 * nod + 1, mid + 1, dr);
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; ++i) {
in >> x;
poz = i, val = x;
actualizare(1, 1, n);
}
while (m--) {
in >> q >> a >> b;
if (q == 0) {
maxim = -1;
start = a, fin = b;
interogare(1, 1, n);
out << maxim << '\n';
} else {
poz = a, val = b;
actualizare(1, 1, n);
}
}
return 0;
}