Pagini recente » Cod sursa (job #3295905) | Clasament iconcurs16 | Cod sursa (job #640625) | Cod sursa (job #198880) | Cod sursa (job #2606096)
#include <fstream>
#include <cmath>
#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 index, int value) {
int indexQ = index / part;
if (index % part != 0)
indexQ ++;
arr[index] = value;
if(query[indexQ] < value)
query[indexQ] = value;
else {
int max = -1000000005;
for (int i = part * (indexQ - 1) + 1;i < part * (indexQ - 1) + 1 + part;i ++)
if (max < arr[i])
max = arr[i];
query[indexQ] = max;
}
}
int getMax(int left, int right) {
int i = left;
int max = arr[left];
while ((i - 1) % part != 0 and i < right) {
if (max < arr[i])
max = arr[i];
i ++;
}
while (i + part <= right) {
int temp = i / part;
if (i % part != 0)
temp ++;
if (max < query[temp])
max = query[temp];
i += part;
}
while (i <= right) {
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 block = 1;
int max = -1000000005;
for (int i = 1;i <= n;i ++) {
if (max < arr[i])
max = arr[i];
query[block] = max;
if (i % part == 0) {
block ++;
max = -1000000005;
}
}
int operation, a, b;
for (int i = 1;i <= m;i ++) {
fin >> operation >> a >> b;
if (operation) {
update(a, b);
} else {
fout << getMax(a, b) << '\n';
}
}
return 0;
}