Pagini recente » Cod sursa (job #403695) | Cod sursa (job #479983) | Cod sursa (job #1759568) | Cod sursa (job #791891) | Cod sursa (job #1480856)
#include <stdio.h>
#define Nadejde 100001
int N, M;
int tree[Nadejde << 1];
/** max(X, Y). **/
int MAX(int X, int Y) {
return (X > Y) ? X : Y;
}
/** Aduna-l pe "val" cu "N". **/
void inc(int *val) {
(*val) += N;
}
/** Construieste arborele de intervale. **/
void build() {
int i;
for (i = N - 1; i > 0; i--) {
tree[i] = MAX(tree[i << 1], tree[(i << 1) | 1]);
}
}
/** Pozitia "pos" va primi valoarea "val". **/
void update(int pos, int val) {
inc(&pos);
tree[pos] = val;
while (pos > 1) {
tree[pos >> 1] = MAX(tree[pos], tree[pos ^ 1]);
pos >>= 1;
}
}
/** Gaseste maximul din intervalul "b" -> "e". **/
int query(int b, int e) {
int u = 0, v = 0;
inc(&b), inc(&e);
while (b < e) {
if (b & 1) {
u = MAX(u, tree[b++]);
}
if (e & 1) {
v = MAX(v, tree[--e]);
}
b >>= 1, e >>= 1;
}
return MAX(u, v);
}
int main(void) {
int i, b, e, task;
FILE *in = fopen("arbint.in", "r");
FILE *out = fopen("arbint.out", "w");
fscanf(in, "%d %d", &N, &M);
for (i = 0; i < N; i++) {
fscanf(in, "%d", &tree[i + N]);
}
build();
while (M--) {
fscanf(in, "%d %d %d", &task, &b, &e);
if (task) {
update(b - 1, e);
} else {
fprintf(out, "%d\n", query(b - 1, e));
}
}
fclose(in);
fclose(out);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}