Pagini recente » Cod sursa (job #2739952) | Cod sursa (job #60335) | Cod sursa (job #2660841) | Cod sursa (job #583237) | Cod sursa (job #2606045)
#include <fstream>
#include <cmath>
#include <iostream>
#define MAX 100005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
int arr[MAX], query[MAX];
int n, m;
int part;
void update(int a, int b) {
if (query[(a - 1) / part + 1] > b)
query[(a - 1) / part + 1] = b;
arr[a] = b;
}
int getMax(int a, int b) {
int max = arr[a];
int i = a;
while ((i - 1) % part != 0 and i < b) {
if (max < arr[i])
max = arr[i];
i ++;
}
while(i + part <= b) {
if (max < query[(i - 1) / part + 1])
max = query[(i - 1) / part + 1];
i += part;
}
while (i <= b) {
if (max < arr[i])
max = arr[i];
i ++;
}
return max;
}
int main() {
fin >> n >> m;
part = sqrt(n);
for (int i = 1;i <= n;i ++)
fin >> arr[i];
int i;
for (i = 1;i <= n - part + 1;i += part) {
int max = arr[i];
for (int j = i;j <= part + i - 1;j ++)
if (max < arr[j])
max = arr[j];
query[(i - 1) / part + 1] = max;
}
int max = arr[i];
int j = i;
for (i = 1;i <= n;i ++) {
if (max < arr[i])
max = arr[i];
}
query[(j - 1) / part + 1] = max;
int operation, left, right;
for (int i = 1;i <= m;i ++) {
fin >> operation >> left >> right;
if (operation == 0) {
fout << getMax(left, right) << '\n';
} else {
update(left, right);
}
}
return 0;
}