Pagini recente » Diferente pentru home intre reviziile 231 si 232 | Cod sursa (job #2021946)
#include <cstdio>
#include <cctype>
#define BUF_SIZE 1 << 12
const int MAXN = 1e5 + 6e4;
int aint[2 * MAXN + 1], a, b;
char buf[BUF_SIZE];
int pos = BUF_SIZE;
inline char getChar(FILE *f) {
if (pos == BUF_SIZE) {
fread(buf, 1, BUF_SIZE, f);
pos = 0;
}
return buf[pos++];
}
inline int read(FILE *f) {
int r = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
r = 10 * r + c - '0';
c = getChar(f);
} while (isdigit(c));
return r;
}
inline int max(int x, int y) {
return x > y ? x : y;
}
void update(int poz, int l, int r) {
if (l == r) {
aint[poz] = b;
} else {
int mid = (l + r) >> 1;
if (a <= mid) {
update(2 * poz, l, mid);
} else {
update(2 * poz + 1, mid + 1, r);
}
aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}
}
int query(int poz, int l, int r) {
if ((a <= l) && (r <= b)) {
return aint[poz];
}
int mid = (l + r) >> 1,
max1 = 0, max2 = 0;
if (a <= mid) {
max1 = query(2 * poz, l, mid);
}
if (mid < b) {
max2 = query(2 * poz + 1, mid + 1, r);
}
return max(max1, max2);
}
int main() {
int op, n, m;
FILE *fin = fopen("arbint.in", "r");
n = read(fin), m = read(fin);
for (a = 1; a <= n; ++a) {
b = read(fin);
update(1, 1, n);
}
FILE *fout = fopen("arbint.out", "w");
for (int i = 0; i < m; ++i) {
op = read(fin), a = read(fin), b = read(fin);
if (op) {
update(1, 1, n);
} else {
fprintf(fout, "%d\n", query(1, 1, n));
}
}
fclose(fin);
fclose(fout);
return 0;
}