Pagini recente » Cod sursa (job #1440320) | Cod sursa (job #68033) | Cod sursa (job #1216317) | Cod sursa (job #1055035) | Cod sursa (job #2690659)
#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 100000;
class InParser {
private:
static const int buff_size = 1 << 16;
char buffer[buff_size];
int buff_pointer;
FILE *infile;
char get_char() {
if(buff_pointer == buff_size) {
buff_pointer = 0;
fread(buffer, sizeof(buffer[0]), buff_size, infile);
}
return buffer[buff_pointer++];
}
public:
InParser(const char* file_name) {
infile = fopen(file_name, "r");
buff_pointer = buff_size;
}
InParser& operator >> (int &nr) {
char ch;
nr = 0;
do {
ch = get_char();
} while(ch < '0' || ch > '9');
while(ch >= '0' && ch <= '9') {
nr = nr * 10 + ch - '0';
ch = get_char();
}
return *this;
}
void close() {
fclose(infile);
}
};
class OutParser {
private:
static const int buff_size = 1 << 16;
char buffer[buff_size];
int buff_pointer;
FILE *outfile;
public:
OutParser(const char* file_name) {
outfile = fopen(file_name, "w");
buff_pointer = 0;
}
OutParser& operator << (int nr) {
int cf[10], nr_cf = 0;
while(nr) {
cf[nr_cf++] = nr % 10;
nr /= 10;
}
for(int i = nr_cf - 1; i >= 0; i--)
buffer[i] = cf[i] + '0';
buff_pointer = nr_cf;
fwrite(buffer, 1, buff_pointer, outfile);
return *this;
}
OutParser& operator << (char ch) {
buffer[0] = ch;
buff_pointer = 1;
fwrite(buffer, 1, buff_pointer, outfile);
return *this;
}
};
int n, m;
int aint[2 * NMAX + 5];
void build() {
for(int i = n - 1; i; i--)
aint[i] = max(aint[i << 1], aint[(i << 1) + 1]);
}
void update(int poz, int val) {
aint[poz += n - 1] = val;
for(poz >>= 1; poz; poz >>= 1)
aint[poz] = max(aint[poz << 1], aint[(poz << 1) + 1]);
}
int query(int st, int dr) {
int ans = -1;
for(st += n - 1, dr += n - 1; st <= dr; st >>= 1, dr >>= 1) {
if(st & 1)
ans = max(ans, aint[st++]);
if(!(dr & 1))
ans = max(ans, aint[dr--]);
}
return ans;
}
int main() {
InParser in("arbint.in");
OutParser out("arbint.out");
in >> n >> m;
for(int i = 0; i < n; i++)
in >> aint[n + i];
build();
for(int i = 1; i <= m; i++) {
int tip, a, b;
in >> tip >> a >> b;
if(!tip)
out << query(a, b) << '\n';
else
update(a, b);
}
in.close();
//out.close();
return 0;
}