Pagini recente » Cod sursa (job #597035) | Cod sursa (job #2469963) | Cod sursa (job #2580301) | Cod sursa (job #1525895) | Cod sursa (job #2794423)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100001;
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 = 32768;
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 = 32768;
ofstream m_stream;
int m_pos;
unique_ptr<char[]> m_buffer;
};
int tree[MAXN * 2], n, m;
void Build() {
for(int i = n - 1; i > 0; i--)
tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}
void Update(int pos, int val) {
tree[pos += n] = val;
for(pos /= 2; pos >= 1; pos /= 2)
tree[pos] = max(tree[pos * 2], tree[pos * 2 + 1]);
}
int Query(int st, int dr) {
int res = 0;
for(st += n, dr += n; st <= dr; st /= 2, dr /= 2) {
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");
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;
}