Pagini recente » Cod sursa (job #929380) | Cod sursa (job #2248281) | Cod sursa (job #1227916) | Cod sursa (job #2381347) | Cod sursa (job #1140199)
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 100005
#define MAXSQRT 1000
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, size;
int a[MAXN];
int asqrt[MAXSQRT];
void precompute()
{
for (int i = 1; i <= size + 1; i++) {
for (int j = (i - 1) * size + 1; j <= i * size; j++) {
asqrt[i] = max(asqrt[i], a[j]);
}
}
}
void update(int poz, int val) {
for (int i = 1; i <= size + 1; i++) {
if (poz <= (i - 1) * size || i * size < poz) {
continue;
}
a[poz] = val;
asqrt[i] = 0;
for (int j = (i - 1) * size + 1; j <= i * size; j++) {
asqrt[i] = max(asqrt[i], a[j]);
}
break;
}
}
int query(int st, int dr)
{
int mx = 0;
for (int i = 1; i <= size + 1; i++) {
if ((i - 1) * size < st && dr <= i * size) {
for (int j = st; j <= dr; j++) {
mx = max(mx, a[j]);
}
return mx;
}
}
for (int i = 1; i <= size + 1; i++) {
if ((i - 1) * size < st && st <= i * size) {
for (int j = st; j <= i * size; j++) {
mx = max(mx, a[j]);
}
continue;
}
if (st <= (i - 1) * size && i * size < dr) {
mx = max(mx, asqrt[i]);
continue;
}
if ((i - 1) * size < dr && dr <= i * size) {
for (int j = (i - 1) * size + 1; j <= dr; j++) {
mx = max(mx, a[j]);
}
continue;
}
}
return mx;
}
int main()
{
memset(a, 0, sizeof(a));
memset(asqrt, 0, sizeof(asqrt));
int m;
f >> n >> m;
for (int i = 1; i <= n; i++) {
f >> a[i];
}
size = 1;
while ((1 << size) <= n) size++;
size--;
precompute();
for (int i = 1; i <= m; i++) {
int op, x, y;
f >> op >> x >> y;
if (op) {
update(x, y);
} else {
g << query(x, y) << '\n';
}
}
f.close();
g.close();
return 0;
}