Pagini recente » Cod sursa (job #3322698) | Cod sursa (job #3325829) | Cod sursa (job #3346783) | Cod sursa (job #3324151) | Cod sursa (job #3333374)
#include <fstream>
#include <vector>
#include <algorithm>
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
using std::vector;
unsigned N, M;
struct ArbInt {
vector<unsigned> maxi;
ArbInt() {
this->maxi.reserve(N << 2);
std::fill(this->maxi.begin(), this->maxi.end(), 0);
unsigned value;
for(unsigned i = 1; i <= N; i += 1) {
in >> value;
this->write(i, value);
}
}
void write(unsigned target, unsigned value) {
unsigned left = 1, right = N, idx = 1, middle;
while(target != left || target != right) {
middle = (left + right) / 2;
if (target <= middle) {
this->maxi[idx] = std::max(
this->maxi[idx * 2 + 1],
value
);
idx = idx * 2;
right = middle;
}
else {
this->maxi[idx] = std::max(
this->maxi[idx * 2],
value
);
idx = idx * 2 + 1;
left = middle + 1;
}
}
this->maxi[idx] = value;
}
unsigned read(
const unsigned target_left,
const unsigned target_right,
const unsigned left = 1,
const unsigned right = N,
const unsigned idx = 1
) {
if(target_left <= left && right <= target_right) {
return this->maxi[idx];
}
const unsigned middle = (left + right) / 2;
unsigned ret = 0;
if(middle >= target_left && left <= target_right) {
ret = this->read(target_left, target_right, left, middle, idx * 2);
}
if(middle <= target_right && right >= target_left) {
ret = std::max(
this->read(target_left, target_right, middle + 1, right, idx * 2 + 1),
ret
);
}
return ret;
}
};
int main()
{
in >> N >> M;
ArbInt arb_int;
unsigned t, x, y;
for(;M != 0; M -= 1) {
in >> t >> x >> y;
if (t == 0) {
out << arb_int.read(x, y) << '\n';
}
if (t == 1) {
arb_int.write(x, y);
}
}
return 0;
}