Mai intai trebuie sa te autentifici.
Cod sursa(job #2268756)
| Utilizator | Data | 25 octombrie 2018 11:35:44 | |
|---|---|---|---|
| Problema | Arbori de intervale | Scor | 20 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.57 kb |
#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;
}
