Pagini recente » Cod sursa (job #92062) | Cod sursa (job #300016) | Cod sursa (job #314227) | Cod sursa (job #316380) | Cod sursa (job #916694)
Cod sursa(job #916694)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdio>
#include <cassert>
#include <cstring>
using namespace std;
class SegmentTree {
public:
SegmentTree(const vector<int>& input) {
size_ = 1;
while (size_ < input.size())
size_ *= 2;
data_ = new int[size_ * 2];
for (size_t i = 0; i < input.size(); ++i)
data_[size_ + i] = input[i];
for (size_t i = input.size(); i < size_; ++i)
data_[size_ + i] = 0;
for (size_t i = size_ - 1; i; --i)
data_[i] = max(data_[i * 2], data_[i * 2 + 1]);
}
void update(int where, const int &value) {
where += size_;
data_[where] = value;
for (where /= 2; where > 0; where /= 2)
data_[where] = max(data_[where * 2], data_[where * 2 + 1]);
}
int query(int from, int to) {
int answer = 0;
from += size_;
to += size_;
while (from <= to) {
answer = max(answer, data_[from]);
from = (from + 1) / 2;
answer = max(answer, data_[to]);
to = (to - 1) / 2;
}
return answer;
}
~SegmentTree() {
delete[] data_;
}
private:
size_t size_;
int* data_;
};
class Reader {
public:
Reader(const int &size = 32768):
size_(size) {
assert(freopen("arbint.in", "r", stdin) != NULL);
buffer_ = new char[32768];
memset(buffer_, 0, sizeof(buffer_));
pointer_ = size_ - 1;
}
Reader& operator>>(int &value) {
value = 0;
bool negative = false;
while ((current() < '0' || current() > '9') && current() != '-')
next();
if (buffer_[pointer_] == '-') {
negative = true;
next();
}
while (current() >= '0' && current() <= '9') {
value = value * 10 + current() - '0';
next();
}
if (negative)
value = -value;
return *this;
}
private:
char current() {
return buffer_[pointer_];
}
void next() {
if (++pointer_ == size_) {
assert(fread(buffer_, 1, size_, stdin) != 0);
pointer_ = 0;
}
}
int size_;
int pointer_;
char *buffer_;
};
int main() {
Reader cin;
ofstream cout("arbint.out");
int N, M; cin >> N >> M;
vector<int> A(N);
for (int i = 0; i < N; ++i)
cin >> A[i];
SegmentTree S(A);
for (int i = 0; i < M; ++i) {
int type, x, y; cin >> type >> x >> y;
if (type == 0)
cout << S.query(x - 1, y - 1) << "\n";
else
S.update(x - 1, y);
}
}