Pagini recente » Borderou de evaluare (job #2003085) | Borderou de evaluare (job #1277448) | Borderou de evaluare (job #1731215) | Cod sursa (job #380105) | Cod sursa (job #2606710)
#include <fstream>
#include <cmath>
#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005
using namespace std;
int arr[MAX], n, m;
int arbore[4 * MAX + 1];
int a, b;
// int Maxim;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
// inline int max_intervals(int left, int right, int son) {
// if (left == right) {
// arbore[son] = arr[left];
// return arr[left];
// }
// int mid = (left + right) / 2;
// arbore[son] = max(max_intervals(left, mid, 2 * son),
// max_intervals(mid + 1, right, 2 * son + 1));
// }
void update(int left, int right, int son) {
if (left == right) {
arbore[son] = b;
arr[left] = b;
return;
}
int mid = (left + right) / 2;
if (a <= mid)
update(left, mid, 2 * son);
else
update(mid + 1, right, 2 * son + 1);
arbore[son] = max(arbore[2 * son], arbore[2 * son + 1]);
}
int getMax(int left, int right, int son) {
if (left >= a and right <= b)
return arbore[son];
int mid = (left + right) / 2;
int Max = -1;
if (a <= mid)
Max = max(Max, getMax(left, mid, 2 * son));
if (b >= mid + 1)
Max = max(Max, getMax(mid + 1, right, 2 * son + 1));
return Max;
}
int main() {
int x;
fin >> n >> m;
for (int i = 1;i <= n;i ++) {
fin >> x;
a = i;
b = x;
update(1, n, 1);
}
int operation;
for (int i = 1;i <= m;i ++) {
fin >> operation >> a >> b;
if (operation)
update(1, n, 1);
else {
// Maxim = -1;
fout << getMax(1, n, 1) << '\n';
}
}
return 0;
}