Pagini recente » Cod sursa (job #415336) | Cod sursa (job #2453034) | Cod sursa (job #116934) | Cod sursa (job #488763) | Cod sursa (job #2269253)
#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;
/// iau cel mai mic inceput >= st
int stPoint = 0;
if (st % Size == 1) {
stPoint = st / Size + 1;
} else {
stPoint = (st - 1 + Size) / Size + 1;
}
/// iau cel mai mic punct <= dr
int finPoint = 0;
if (dr % Size == 0) {
finPoint = dr / Size;
} else {
finPoint = dr / Size;
}
for (int i = stPoint; i <= finPoint; ++i) {
maxim = max(maxim, b[i]);
}
if (st % Size != 1) {
for (int i = st; i <= dr && i % Size != 1; ++i) {
maxim = max(maxim, v[i]);
}
}
if (dr % Size != 0) {
for (int i = dr;i >=st && i % Size != 0; --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;
}