Pagini recente » Cod sursa (job #2915535) | Cod sursa (job #2494815) | Cod sursa (job #2918046) | Cod sursa (job #1163157) | Cod sursa (job #1978930)
#include <fstream>
#include <cstdio>
using namespace std;
#define UPDATE 1
#define QUERY 0
#define MAX_N 100001
int op, a, b;
int n, m;
int range_tree[4 * MAX_N + 66];
int pos, val;
int target_l, target_r;
void update(int node, int l, int r)
{
//cout << node << " " << l << " " << r << " " << pos << " " << val << endl;
if (l == r) {
//cout << "oke!" << endl;
range_tree[node] = val;
return ;
}
int m = (l + r) / 2;
if (pos <= m) {
update(2 * node + 1, l, m);
} else {
update(2 * node + 2, m + 1, r);
}
range_tree[node] = max(range_tree[2 * node + 1], range_tree[2 * node + 2]);
}
int max_q;
void query(int node, int l, int r)
{
//cout << l << " " << r << " " << target_l << " " << target_r << endl;
if (target_l <= l && target_r >= r) {
if (range_tree[node] > max_q) max_q = range_tree[node];
return ;
}
int m = (l + r) / 2;
if (target_l <= m) {
query(2 * node + 1, l, m);
}
if (target_r > m) {
query(2 * node + 2, m + 1, r);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 0, x; i < n; i++) {
scanf("%d", &x);
pos = i;
val = x;
update(0, 0, n - 1);
}
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &op, &a, &b);
if (op == QUERY) {
target_l = a - 1;
target_r = b - 1;
max_q = -1;
query(0, 0, n - 1);
printf("%d\n", max_q);
} else {
pos = a - 1;
val = b;
update(0, 0, n - 1);
}
}
return 0;
}