Pagini recente » Cod sursa (job #2730079) | Cod sursa (job #712525) | Cod sursa (job #2877102) | Cod sursa (job #348396) | Cod sursa (job #1487220)
#include <stdio.h>
#include <iostream>
using namespace std;
#include <set>
#include <list>
#include <vector>
#define dim 100001
int n, m;
int maxArb[4 * dim + 1];
int start, finish, val, pos, maxim;
inline int max(int a, int b){
if (a > b) return a;
return b;
}
void update(int, int, int);
void query(int, int, int);
int main(int argc, const char * argv[]) {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int x;
cin >> n >> m;
for (int i = 1; i <= n; i++){
cin >> x;
pos = i;
val = x;
update(1, 1, n);
}
int a, b;
for (int i = 1; i <= m; i++){
cin >> x >> a >> b;
if (x){
pos = a;
val = b;
update(1, 1, n);
}
else{
maxim = -1;
start = a;
finish = b;
query(1, 1, n);
cout << maxim << '\n';
}
}
return 0;
}
void update(int nod, int left, int right){
if (left == right){
maxArb[nod] = val;
return;
}
int mij = (left + right) / 2;
if (pos <= mij)
update(2 * nod, left, mij);
else
update(2 * nod + 1, mij + 1, right);
maxArb[nod] = max(maxArb[2 * nod], maxArb[2 * nod + 1]);
}
void query(int nod, int left, int right){
if (start <= left and right <= finish){
if (maxim < maxArb[nod])
maxim = maxArb[nod];
return;
}
int mij = (left + right) / 2;
if (start <= mij)
query(2 * nod, left, mij);
else
query(2 * nod + 1, mij + 1, right);
}