Pagini recente » Diferente pentru planificare/sedinta-20081107 intre reviziile 28 si 24 | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2247252)
#include <bits/stdc++.h>
#define N 100001
using namespace std;
int n, m, v[N], bit[263000], pos[N];
void bit_build(int k, int a, int b) {
if (a == b) {
bit[k] = v[a];
pos[a] = k;
} else {
int m = (a + b) >> 1;
bit_build(k << 1, a, m);
bit_build(k << 1 | 1, m + 1, b);
bit[k] = max(bit[k << 1], bit[k << 1 | 1]);
}
}
void bit_update(int k) {
if (k) {
bit[k] = max(bit[k << 1], bit[k << 1 | 1]);
bit_update(k >> 1);
}
}
int bit_query(int k, int l, int r, int a, int b) {
if (a <= l && r <= b) return bit[k];
else {
int m = (l + r) >> 1;
int maxl = 0, maxr = 0;
if (a <= m) maxl = bit_query(k << 1, l, m, a, b);
if (m < b) maxr = bit_query(k << 1 | 1, m + 1, r, a, b);
return max(maxl, maxr);
}
}
int main() {
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int i;
fin >> n >> m;
for (i = 1; i <= n; i++)
fin >> v[i];
bit_build(1, 1, n);
int t, a, b;
while (m--) {
fin >> t >> a >> b;
if (t == 0)
fout << bit_query(1, 1, n, a, b) << '\n';
else {
bit[pos[a]] = b;
bit_update(pos[a] >> 1);
}
}
return 0;
}