Cod sursa(job #638729)
#include <cstdio>
#define N 262144
int n, m;
int a[N];
int b[N];
int max(int a, int b) {
if(a > b) return a;
return b;
}
int query(int l, int r) {
int poz;
if (l > r)
poz = -1;
else
poz = r;
int i = r;
while(i >= l) {
if (i - (i & -i) + 1 > l) {
if(a[b[i]] > a[poz])
poz = b[i];
i = i - (i & -i);
}
else {
if (a[i] > a[poz])
poz = i;
i--;
}
}
return poz;
}
void update(int poz, int newval) {
a[poz] = newval;
int i = poz;
while(i <= n) {
b[i] = max(newval, max(a[query(i - (i & -i) + 1, poz - 1)], a[query(poz + 1, i)]));
i += (i & -i);
}
}
int main() {
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1; i <= n; i++) {
scanf("%d",&a[i]);
update(i, a[i]);
}
for(int i = 1; i <= m; i++) {
int cod, l, r;
scanf("%d %d %d",&cod,&l,&r);
if(cod == 0) {
printf("%d\n",a[query(l, r)]);
}
else {
update(l,r);
}
}
return 0;
}