Pagini recente » Monitorul de evaluare | Cod sursa (job #1560872) | Cod sursa (job #2698468) | Cod sursa (job #1236513) | Cod sursa (job #2615571)
#include <stdio.h>
#define max(a, b) a>b?a:b
#define log(x) 31-__builtin_clz(x)
#define N 1<<18
int n, seg[N];
void update (int i, int x) {
i+=n-1;
seg[i]=x;
while (i>>=1)
seg[i]=max(seg[i<<1], seg[(i<<1)+1]);
}
int query (int l, int r) {
l+=n-1;
r+=n-1;
int ans=0;
while (l<=r) {
if (l&1) {
ans=max(ans, seg[l]);
++l;
}
if (!(r&1)) {
ans=max(ans, seg[r]);
--r;
}
l>>=1;
r>>=1;
}
return ans;
}
int main (void) {
FILE *fin=fopen("arbint.in", "r"),
*fout=fopen("arbint.out", "w");
int save, q, x, y, i;
fscanf(fin, "%d%d", &n, &q);
save=n;
if (n&(n-1))
n=1<<log(n)+1;
for (i=1; i<=save; ++i) {
fscanf(fin, "%d", &x);
update(i, x);
}
int key;
for (; q; q--) {
fscanf(fin, "%d%d%d", &key, &x, &y);
if (key)
update(x, y);
else
fprintf(fout, "%d\n", query(x, y));
}
return 0;
}