Pagini recente » Cod sursa (job #1846255) | Cod sursa (job #1711018) | Cod sursa (job #833324) | Cod sursa (job #2987838) | Cod sursa (job #2269263)
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#define NMAX 101000
#define BMAX 100000
#define VMAX 1000000000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long long int n, m;
long long int v[NMAX];
long long int b[BMAX];
long long int Size;
void creare() {
long long 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;
}
}
}
long long int getMaxim(int st, int dr) {
long long int maxim = 0;
/// iau cel mai mic inceput >= st
long long int stPoint = 0;
if (st % Size == 1) {
stPoint = st / Size + 1;
} else {
stPoint = (st - 1 + Size) / Size + 1;
}
/// iau cel mai mic punct <= dr
long long 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 --) {
long long int Tip, st, dr;
f >> Tip >> st >> dr;
if (Tip == 0) {
g << getMaxim(st, dr) << "\n";
} else {
long long int pos = 0;
if (st % Size == 0) {
pos = st / Size;
} else {
pos = st / Size + 1;
}
if (b[pos] <= dr || v[st] == b[pos]) {
v[st] = dr;
creare();
}
v[st] = dr;
}
}
return 0;
}