Pagini recente » Cod sursa (job #285138) | Cod sursa (job #1588095) | Cod sursa (job #2800706) | Cod sursa (job #2350932) | Cod sursa (job #2338604)
#include <bits/stdc++.h>
#define MAXN 100000
int v[MAXN];
int n, m;
int *tree;
void build(int arr[]){
tree = new int[2 * n - 1];
tree--;
for (int i = 0; i < n; i++)
tree[n + i] = arr[i];
for (int i = n - 1; i > 0; --i)
tree[i] = std::max(tree[i << 1], tree[i << 1 | 1]);
}
void updateTreeNode(int p, int value){
p += n;
tree[p] = value;
while (p > 1) {
p >>= 1;
tree[p] = std::max(tree[p << 1], tree[p << 1 | 1]);
}
}
int query(int l, int r){
l += n - 1;
r += n + 1;
int res = -1;
while (r - l > 1) {
if(l != 0 && (l & 1) == 0)
res = std::max(res, tree[++l]);
if(r != 1 && (r & 1) == 1)
res = std::max(res, tree[--r]);
l >>= 1;
r >>= 1;
}
return res;
}
int main(){
FILE*fi,*fo;
fi = fopen("arbint.in","r");
fo = fopen("arbint.out","w");
fscanf(fi,"%d%d", &n, &m);
for(int i = 0; i < n; i++)
fscanf(fi,"%d", &v[i]);
build(v);
for(int i = 1; i <= m; i++){
int c, a, b;
fscanf(fi,"%d%d%d", &c, &a, &b);
if(c == 0)
fprintf(fo,"%d\n", query(a - 1, b - 1));
else
updateTreeNode(a - 1, b);
}
return 0;
}