Pagini recente » Cod sursa (job #763470) | Cod sursa (job #1000862) | Cod sursa (job #3187268) | Cod sursa (job #1095986) | Cod sursa (job #2268756)
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#define NMAX 100100
#define BMAX 1000
#define VMAX 1000000000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m;
int v[NMAX];
int b[BMAX];
int Size;
void creare() {
int maxim = 0;
for (int i = 1; i <= Size * Size; ++i) {
maxim = max(maxim, v[i]);
if (i % Size == 0) {
b[i / Size] = maxim;
maxim = 0;
}
}
}
int getMaxim(int st, int dr) {
int maxim = 0;
int startPoint = 0;
int currentSize;
if (st % Size == 1) {
startPoint = st / Size;
} else {
startPoint = ( (st - 1) / Size) + 1;
}
currentSize = startPoint * Size + 1;
for (int i = st; i < currentSize && i <= dr; ++i) {
maxim = max(maxim, v[i]);
}
while (currentSize + Size <= dr) {
maxim = max(maxim, b[startPoint + 1]);
startPoint ++;
currentSize = currentSize + Size;
}
for (int i = currentSize; i <= dr; ++i) {
maxim = max(maxim, v[i]);
}
return maxim;
}
int main() {
f >> n >> m;
Size = sqrt(n);
for (int i = 1; i <= n; ++i) {
f >> v[i];
}
creare();
while (m --) {
int Tip, st, dr;
f >> Tip >> st >> dr;
if (Tip == 0) {
g << getMaxim(st, dr) << "\n";
} else {
int pos = (st + Size - 1) / Size;
v[st] = dr;
creare();
}
}
return 0;
}