Pagini recente » Cod sursa (job #1505509) | Cod sursa (job #371138) | Cod sursa (job #2052882) | Cod sursa (job #2120869) | Cod sursa (job #2055580)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX = 100000;
int n, m, maxx;
int np; //number of internal nodes in the full segment tree
int arbint[4 * (1 + NMAX)];
void update(int i) {
if (0 < i) {
arbint[i] = max(arbint[2 * i], arbint[2 * i + 1]);
update(i / 2);
}
}
int query(int from, int to) {
int answer = 0;
if (from == to)
answer = arbint[from];
else if (from < to) {
if (from % 2 == 1) {
answer = max(answer, arbint[from]);
from++;
}
if (to % 2 == 0) {
answer = max(answer, arbint[to]);
to--;
}
int local = query(from / 2, to / 2);
// cout << from << " " << to << " " << local << endl;
return max(answer, local);
}
return answer;
}
int main() {
in >> n >> m;
int pow = 0;
while ((1 << pow) < n)
pow++;
np = (1 << pow) - 1;
for (int i = 1; i <= n; i++) {
in >> arbint[np + i];
update((np + i) / 2);
}
for (int i = 1; i <= m; i++) {
int p, x, y;
in >> p >> x >> y;
if (p == 1) {
arbint[np + x] = y;
update((np + x) / 2);
} else {
// for (int i = 1; i <= np + n; i++)
// cout << arbint[i] << " ";
out << query(np + x, np + y) << '\n';
}
}
in.close();
out.close();
return 0;
}