Pagini recente » Cod sursa (job #1681314) | Cod sursa (job #940180) | Cod sursa (job #1769989) | Cod sursa (job #413868) | Cod sursa (job #638743)
Cod sursa(job #638743)
#include <cstdio>
#define N 262144
int n, m;
int a[N];
int b[N];
int max(int c, int d) {
if(a[c] > a[d]) return c;
return d;
}
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(poz, max(query(i - (i & -i) + 1, poz - 1), 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;
}