Pagini recente » Cod sursa (job #687506) | Cod sursa (job #63487) | Cod sursa (job #2157025) | Cod sursa (job #2060718) | Cod sursa (job #1760087)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <memory>
#define NMAX 100005
using namespace std;
class Reader {
public:
Reader(const string& filename):
m_stream(filename),
m_pos(kBufferSize - 1),
m_buffer(new char[kBufferSize]) {
next();
}
Reader& operator>>(int& value) {
value = 0;
while (current() < '0' || current() > '9')
next();
while (current() >= '0' && current() <= '9') {
value = value * 10 + current() - '0';
next();
}
return *this;
}
private:
const int kBufferSize = 655536;
char current() {
return m_buffer[m_pos];
}
void next() {
if (!(++m_pos != kBufferSize)) {
m_stream.read(m_buffer.get(), kBufferSize);
m_pos = 0;
}
}
ifstream m_stream;
int m_pos;
unique_ptr<char[]> m_buffer;
};
class Writer {
public:
Writer(const string& filename):
m_stream(filename),
m_pos(0),
m_buffer(new char[kBufferSize]) {}
Writer& operator<<(int value) {
char digits[10];
int nr = 0, q;
do {
q = value / 10;
digits[nr++] = value - (q << 1) - (q << 3) + '0';
value = q;
} while (value);
while (nr--) {
m_buffer[m_pos++] = digits[nr];
if (m_pos == kBufferSize) Flush();
}
return *this;
}
Writer& operator<<(char value) {
m_buffer[m_pos++] = value;
if (m_pos == kBufferSize) Flush();
return *this;
}
void Flush(){
m_stream.write(m_buffer.get(), m_pos);
m_pos = 0;
}
private:
const int kBufferSize = 655536;
ofstream m_stream;
int m_pos;
unique_ptr<char[]> m_buffer;
};
using namespace std;
int n, m;
int tree[NMAX << 1];
void Build(){
for (int i = n - 1; i; --i){
tree[i] = max(tree[i << 1], tree[i << 1 | 1]);
}
}
void Update(int poz, int val)
{
tree[poz += n] = val;
for (poz >>= 1; poz >= 1; poz >>= 1)
tree[poz] = max(tree[poz << 1], tree[poz << 1 | 1]);
}
int Query(int st, int dr)
{
int res = 0;
for (st += n, dr += n; st <= dr; st >>= 1, dr >>= 1){
if (st & 1) res = max(res, tree[st++]);
if (!(dr & 1)) res = max(res, tree[dr--]);
}
return res;
}
int main()
{
Reader fin("arbint.in");
Writer fout("arbint.out");
//#define fin cin
//#define fout cout
fin >> n >> m;
for (int i = 0; i < n; ++i)
{
fin >> tree[i + n];
}
Build();
for (int i = 0; i < m; ++i)
{
int t, a, b;
fin >> t >> a >> b;
if (t == 0)
fout << Query(a - 1, b - 1) << '\n';
else{
Update(a - 1, b);
}
}
fout.Flush();
return 0;
}